From 2b825faa1741405d96d0970e66bc49918ea61393 Mon Sep 17 00:00:00 2001 From: kris Date: Tue, 20 May 2008 20:22:50 +0000 Subject: [PATCH] Nmap now ships and links with OpenSSL (currently the newest 0.9.8g) on Windows. The necessary libraries (lib and dll) and headers required for compilation and linking are in mswin32/OpenSSL. A detailed upgrade guide is available in mswin32/OpenSSL/upgrade-guide.txt. Thanks to Thomas Buchanan for doing the initial work and writing up the initial build guide. My openssl-testing branch has been posted on nmap-dev for 12 days and has been tested by (at least) Thomas, Jah and I, with no reports of failure. http://seclists.org/nmap-dev/2008/q2/0249.html --- mswin32/Makefile | 1 + mswin32/OpenSSL/bin/libeay32.dll | Bin 0 -> 1044480 bytes mswin32/OpenSSL/bin/ssleay32.dll | Bin 0 -> 200704 bytes mswin32/OpenSSL/include/openssl/aes.h | 138 + mswin32/OpenSSL/include/openssl/applink.c | 94 + mswin32/OpenSSL/include/openssl/asn1.h | 1278 ++++++ mswin32/OpenSSL/include/openssl/asn1_mac.h | 571 +++ mswin32/OpenSSL/include/openssl/asn1t.h | 886 +++++ mswin32/OpenSSL/include/openssl/bio.h | 775 ++++ mswin32/OpenSSL/include/openssl/blowfish.h | 127 + mswin32/OpenSSL/include/openssl/bn.h | 839 ++++ mswin32/OpenSSL/include/openssl/buffer.h | 118 + mswin32/OpenSSL/include/openssl/cast.h | 105 + mswin32/OpenSSL/include/openssl/comp.h | 66 + mswin32/OpenSSL/include/openssl/conf.h | 254 ++ mswin32/OpenSSL/include/openssl/conf_api.h | 89 + mswin32/OpenSSL/include/openssl/crypto.h | 550 +++ mswin32/OpenSSL/include/openssl/des.h | 244 ++ mswin32/OpenSSL/include/openssl/des_old.h | 445 +++ mswin32/OpenSSL/include/openssl/dh.h | 234 ++ mswin32/OpenSSL/include/openssl/dsa.h | 285 ++ mswin32/OpenSSL/include/openssl/dso.h | 368 ++ mswin32/OpenSSL/include/openssl/dtls1.h | 211 + mswin32/OpenSSL/include/openssl/e_os2.h | 279 ++ mswin32/OpenSSL/include/openssl/ebcdic.h | 19 + mswin32/OpenSSL/include/openssl/ec.h | 526 +++ mswin32/OpenSSL/include/openssl/ecdh.h | 123 + mswin32/OpenSSL/include/openssl/ecdsa.h | 271 ++ mswin32/OpenSSL/include/openssl/engine.h | 785 ++++ mswin32/OpenSSL/include/openssl/err.h | 318 ++ mswin32/OpenSSL/include/openssl/evp.h | 979 +++++ mswin32/OpenSSL/include/openssl/hmac.h | 108 + mswin32/OpenSSL/include/openssl/idea.h | 100 + mswin32/OpenSSL/include/openssl/krb5_asn.h | 256 ++ mswin32/OpenSSL/include/openssl/kssl.h | 179 + mswin32/OpenSSL/include/openssl/lhash.h | 200 + mswin32/OpenSSL/include/openssl/md2.h | 92 + mswin32/OpenSSL/include/openssl/md4.h | 117 + mswin32/OpenSSL/include/openssl/md5.h | 117 + mswin32/OpenSSL/include/openssl/obj_mac.h | 3433 +++++++++++++++++ mswin32/OpenSSL/include/openssl/objects.h | 1049 +++++ mswin32/OpenSSL/include/openssl/ocsp.h | 614 +++ mswin32/OpenSSL/include/openssl/opensslconf.h | 230 ++ mswin32/OpenSSL/include/openssl/opensslv.h | 89 + mswin32/OpenSSL/include/openssl/ossl_typ.h | 174 + mswin32/OpenSSL/include/openssl/pem.h | 776 ++++ mswin32/OpenSSL/include/openssl/pem2.h | 70 + mswin32/OpenSSL/include/openssl/pkcs12.h | 333 ++ mswin32/OpenSSL/include/openssl/pkcs7.h | 464 +++ mswin32/OpenSSL/include/openssl/pq_compat.h | 147 + mswin32/OpenSSL/include/openssl/pqueue.h | 95 + mswin32/OpenSSL/include/openssl/rand.h | 140 + mswin32/OpenSSL/include/openssl/rc2.h | 101 + mswin32/OpenSSL/include/openssl/rc4.h | 87 + mswin32/OpenSSL/include/openssl/ripemd.h | 104 + mswin32/OpenSSL/include/openssl/rsa.h | 455 +++ mswin32/OpenSSL/include/openssl/safestack.h | 1854 +++++++++ mswin32/OpenSSL/include/openssl/sha.h | 200 + mswin32/OpenSSL/include/openssl/ssl.h | 2026 ++++++++++ mswin32/OpenSSL/include/openssl/ssl2.h | 268 ++ mswin32/OpenSSL/include/openssl/ssl23.h | 83 + mswin32/OpenSSL/include/openssl/ssl3.h | 560 +++ mswin32/OpenSSL/include/openssl/stack.h | 109 + mswin32/OpenSSL/include/openssl/store.h | 554 +++ mswin32/OpenSSL/include/openssl/symhacks.h | 383 ++ mswin32/OpenSSL/include/openssl/tls1.h | 374 ++ mswin32/OpenSSL/include/openssl/tmdiff.h | 93 + mswin32/OpenSSL/include/openssl/txt_db.h | 109 + mswin32/OpenSSL/include/openssl/ui.h | 381 ++ mswin32/OpenSSL/include/openssl/ui_compat.h | 83 + mswin32/OpenSSL/include/openssl/x509.h | 1344 +++++++ mswin32/OpenSSL/include/openssl/x509_vfy.h | 531 +++ mswin32/OpenSSL/include/openssl/x509v3.h | 919 +++++ mswin32/OpenSSL/lib/libeay32.lib | Bin 0 -> 664514 bytes mswin32/OpenSSL/lib/ssleay32.lib | Bin 0 -> 52184 bytes mswin32/OpenSSL/upgrade-guide.txt | 45 + mswin32/nmap.rc | 4 +- mswin32/nmap.vcproj | 16 +- mswin32/nsis/Nmap.nsi | 8 +- nmap_winconfig.h | 1 + 80 files changed, 30441 insertions(+), 12 deletions(-) create mode 100644 mswin32/OpenSSL/bin/libeay32.dll create mode 100644 mswin32/OpenSSL/bin/ssleay32.dll create mode 100755 mswin32/OpenSSL/include/openssl/aes.h create mode 100755 mswin32/OpenSSL/include/openssl/applink.c create mode 100755 mswin32/OpenSSL/include/openssl/asn1.h create mode 100755 mswin32/OpenSSL/include/openssl/asn1_mac.h create mode 100755 mswin32/OpenSSL/include/openssl/asn1t.h create mode 100755 mswin32/OpenSSL/include/openssl/bio.h create mode 100755 mswin32/OpenSSL/include/openssl/blowfish.h create mode 100755 mswin32/OpenSSL/include/openssl/bn.h create mode 100755 mswin32/OpenSSL/include/openssl/buffer.h create mode 100755 mswin32/OpenSSL/include/openssl/cast.h create mode 100755 mswin32/OpenSSL/include/openssl/comp.h create mode 100755 mswin32/OpenSSL/include/openssl/conf.h create mode 100755 mswin32/OpenSSL/include/openssl/conf_api.h create mode 100755 mswin32/OpenSSL/include/openssl/crypto.h create mode 100755 mswin32/OpenSSL/include/openssl/des.h create mode 100755 mswin32/OpenSSL/include/openssl/des_old.h create mode 100755 mswin32/OpenSSL/include/openssl/dh.h create mode 100755 mswin32/OpenSSL/include/openssl/dsa.h create mode 100755 mswin32/OpenSSL/include/openssl/dso.h create mode 100755 mswin32/OpenSSL/include/openssl/dtls1.h create mode 100755 mswin32/OpenSSL/include/openssl/e_os2.h create mode 100755 mswin32/OpenSSL/include/openssl/ebcdic.h create mode 100755 mswin32/OpenSSL/include/openssl/ec.h create mode 100755 mswin32/OpenSSL/include/openssl/ecdh.h create mode 100755 mswin32/OpenSSL/include/openssl/ecdsa.h create mode 100755 mswin32/OpenSSL/include/openssl/engine.h create mode 100755 mswin32/OpenSSL/include/openssl/err.h create mode 100755 mswin32/OpenSSL/include/openssl/evp.h create mode 100755 mswin32/OpenSSL/include/openssl/hmac.h create mode 100755 mswin32/OpenSSL/include/openssl/idea.h create mode 100755 mswin32/OpenSSL/include/openssl/krb5_asn.h create mode 100755 mswin32/OpenSSL/include/openssl/kssl.h create mode 100755 mswin32/OpenSSL/include/openssl/lhash.h create mode 100755 mswin32/OpenSSL/include/openssl/md2.h create mode 100755 mswin32/OpenSSL/include/openssl/md4.h create mode 100755 mswin32/OpenSSL/include/openssl/md5.h create mode 100755 mswin32/OpenSSL/include/openssl/obj_mac.h create mode 100755 mswin32/OpenSSL/include/openssl/objects.h create mode 100755 mswin32/OpenSSL/include/openssl/ocsp.h create mode 100755 mswin32/OpenSSL/include/openssl/opensslconf.h create mode 100755 mswin32/OpenSSL/include/openssl/opensslv.h create mode 100755 mswin32/OpenSSL/include/openssl/ossl_typ.h create mode 100755 mswin32/OpenSSL/include/openssl/pem.h create mode 100755 mswin32/OpenSSL/include/openssl/pem2.h create mode 100755 mswin32/OpenSSL/include/openssl/pkcs12.h create mode 100755 mswin32/OpenSSL/include/openssl/pkcs7.h create mode 100755 mswin32/OpenSSL/include/openssl/pq_compat.h create mode 100755 mswin32/OpenSSL/include/openssl/pqueue.h create mode 100755 mswin32/OpenSSL/include/openssl/rand.h create mode 100755 mswin32/OpenSSL/include/openssl/rc2.h create mode 100755 mswin32/OpenSSL/include/openssl/rc4.h create mode 100755 mswin32/OpenSSL/include/openssl/ripemd.h create mode 100755 mswin32/OpenSSL/include/openssl/rsa.h create mode 100755 mswin32/OpenSSL/include/openssl/safestack.h create mode 100755 mswin32/OpenSSL/include/openssl/sha.h create mode 100755 mswin32/OpenSSL/include/openssl/ssl.h create mode 100755 mswin32/OpenSSL/include/openssl/ssl2.h create mode 100755 mswin32/OpenSSL/include/openssl/ssl23.h create mode 100755 mswin32/OpenSSL/include/openssl/ssl3.h create mode 100755 mswin32/OpenSSL/include/openssl/stack.h create mode 100755 mswin32/OpenSSL/include/openssl/store.h create mode 100755 mswin32/OpenSSL/include/openssl/symhacks.h create mode 100755 mswin32/OpenSSL/include/openssl/tls1.h create mode 100755 mswin32/OpenSSL/include/openssl/tmdiff.h create mode 100755 mswin32/OpenSSL/include/openssl/txt_db.h create mode 100755 mswin32/OpenSSL/include/openssl/ui.h create mode 100755 mswin32/OpenSSL/include/openssl/ui_compat.h create mode 100755 mswin32/OpenSSL/include/openssl/x509.h create mode 100755 mswin32/OpenSSL/include/openssl/x509_vfy.h create mode 100755 mswin32/OpenSSL/include/openssl/x509v3.h create mode 100644 mswin32/OpenSSL/lib/libeay32.lib create mode 100644 mswin32/OpenSSL/lib/ssleay32.lib create mode 100755 mswin32/OpenSSL/upgrade-guide.txt diff --git a/mswin32/Makefile b/mswin32/Makefile index 4090a5abd..ed23a641a 100644 --- a/mswin32/Makefile +++ b/mswin32/Makefile @@ -22,6 +22,7 @@ winbuild: rm -rf nmap-$(NMAP_VERSION) mkdir nmap-$(NMAP_VERSION) cd Release && cp -r ../../CHANGELOG ../../COPYING nmap-mac-prefixes nmap-os-db nmap-protocols nmap-rpc nmap-service-probes nmap-services nmap.exe nmap.xsl ../nmap_performance.reg ../../README-WIN32 ../nmap-$(NMAP_VERSION)/ + cp -f OpenSSL/bin/*.dll ./nmap-$(NMAP_VERSION)/ mkdir nmap-$(NMAP_VERSION)/scripts cd Release && cp -f $(NSE_FILES) ../nmap-$(NMAP_VERSION)/scripts/ mkdir nmap-$(NMAP_VERSION)/nselib diff --git a/mswin32/OpenSSL/bin/libeay32.dll b/mswin32/OpenSSL/bin/libeay32.dll new file mode 100644 index 0000000000000000000000000000000000000000..c590e0ae90bc28e26cd755caba631a5bc8d6776e GIT binary patch literal 1044480 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

4Zxp6dL&|DDqBp$yJ|lI{n(>;@% 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%0AKN$yU_IY2aXHrfNv5@^ z#O7$luxS;XZJ_LmT&q4!6C0z&2i-rz&piX5)k$WI-+D+u#N5G7Yo%&f%X8Bz{gL(Q z{y)BBJ z`=TCaD<_LKi0g9KBbixWeHUiImO}xxj3h1<6V7@@@qCNG+eGJ!ho5QgYB$20g~LK zXYR7Ig7!shnW`mX>?(gxwI#Xv6%zR^Ju3NU-Yk>4sBf7J83e*DbY_xn&4opcvge|; z$Q6ClBp+%2^z&WZca(5*VXC8&@A%2f`^Nc8!I4SX`r2yb_~9gT?G;K{B8A7z<+gv? z#DXHrC5eq^Egi6*?;Sx=1#)?Otj!aXANe`uWc(zv^D^y}&B@WC{;^$P8PGY&QkkdPtCWI1 z2B=F3Yb+(?R!ZimW=_8Ampntkzhz4X>z2#?ANsdeG3EA8Hnq0u^EvlE$;66VDg8SQ zXup4Ln$`Aif}b;~ImZ>}9N51qA2g+)eXI8F-w!V->YvIhijEly{s7>RgWo?nZC1{G z7u`D(&YsM{$&>uzFSfyYCYhYgVvpS>X|>zQYV+L-gzBXWqmrU>vz?#T_Yl51W_YT3V*mkJ=iU7fLyxrB;HZE)l%Jk z?3_y|VMS$Mnnh%s^Zeu&K>_Y31kN4%IjMy zGG(Bmz9k}mE9+aL^0!KYk@whZJ#>IB^$=c}(J^ulIy?P$-CGvAh=23=_bUHNAYPz`ViGxvO-BQMPyn3UTEELmNMGwmev zF>;TvGhG9^x3{OqCa)u3ynpOd8skHj?K2nkB-ejJqIAv1hq(9a#CNaTq|5RlNlvu8 zbmAWM6qbMx!BU(2zgMX7MGI z9x0y(%V%z!BQe5zy1einWwMBF#`fxxzUw-YPxC4Qj9?&U<|M%YdNm2vb7=B8A9R}6 zxZTRY!l1ym?v(V*b8o$cyyxa-mTVY#8&B&$I|xSO3_-2&*+H%SV-3i0I=Q~CBD-~v zM5xUmQD7S%qH@JyTLQ-{?wd&X9K?zJMMFruVK};F-V#BkY zm*Q_!_9(mm(By~N@>l4L*p@zc!ljh(Jy<*NubqA{-! z+M2u#jbiv17A9>YDwVR2q&c=Sup*UdyGt9Mz3N5{HXQMru>2G1pQ!bZr~dTXed_+( z|5i6zQ}&Vr>%LioUlV{cA2@~;N1HpJaH|!I%AOz^*_J?kiH-+)nu=axN%zY`-&Y4t zD0>?nrzkQ%QL=4kC2j&mdT-~<{G6(EGn0?}pRG^)a z=N35fWWU&HeLuiB^yK7SPXC6{>%*gPWA1t;^KaZv_K|^;#|)n@1qbg^zdX$0l-5*c!j7=-q!9ApF_}) zC3FNA;*^)b)5~+CBvKtD&JsgRN_=tR70?C@dlZ|89LKz3kz72|SGi%>x(^noN3Z+f zm~@4HA;cYD!YUY(Lg3pfCl}zJ+p7tk~xfZ*cn_JQ(hfUmT0S&0i=|eTzSXxIT+1 z7S3J?&MM62*Y=3HXGVFtHcPBwQhw^DRHP3CE|UGI^r|^TFR7wgT)>gynydUp%5IY) z(Ao4dP0!eLVW8ZUW!|7c=nMIUT}re!Sa9~EK}5{qikvxr(_~o7#?%PT|NE~$?3Qc3rF_lrZnT?v@+uS}f#<(ouFyF%hW=q*&gO zDn%JR;y6(^sz)2HwF)KPn4G6OLOvk81iL26htsg(m~R)#6b=9HVZJ53c<%aPb*TYE zXEQnl`s4ar!O8-?pU21t;RwArEzN2V#R2Md-XSu1$KFc3&5idA-2ZH>q6Tx=O|HGO zADdQX-FEQ`=3wbh@$GBa%D#OH`LS@7(Hz1N!!*KX$6ufURs3(K1YK2~B@#(8Xtv2G zHEoHZW9O_$DbX+~fZ(lY@Z(jf32o-)Go|;4%#@7H;)eht-&CtDg9}M#p<=)F6~V7a z<8rDNlVgcm^<>MrmO`yJR|I>rR5zZzh`48gchC_9o4gUrS@^uDj%)Yv=86DN<3?}B z39MPP$6Sv!znpmYgiggi(jJ$f_o6)>nOh>UaIcCs~z;*;#EuJ-v9DN9S<;H1uD2KHCFdB z7RQjut1T>WvRZ5oPKw)mQX6s}mqQIUOK6BlCoBi(;)x?=-ZI`W8DJA;Idvw?POTYR zwcHOB&Wuj>_ywKQE6#;FXorCej3Rcx{$`Jt3gVq@8M#_WuGFBrtLb?aMuTXK_*g$4 zEL;epPS3$gMp*dixYtQ&|M|_%oC*==X9_?v5}!VGOiisE)`_ z&-;x#S9`fSrM*m;cj#QgoG)Eu-6n%feCfA`QVoe!kzGxg^J8V^?3@-Els?=EIfHmp zA4M5;>&Sq?n^G{jp8rRw95=jA2if^23u5P6wk5KceM2TEdb6LZhxP#b22})ZUr=N} zkY^U5;pTH#!;8PzRY3QD+&5qqpMHGn7AingJLP!SU#|rex&C^9$`tu@f4z&7UlY=u zXUL~-mC5RZtuOu zzK_-RlYfeRU*>(6woqP&_wM@p&9v{tTRl_SAMjPMLeKUbq>k1EH$L@49iQUA2mGh_ z*Oi+RtYI?o2FO2H`mzr;!m9(lXUR}8i?f>>b;)~I-l-oMtkqol0#nlS0;Gj*d}{Qe z!&Eov>O)=sr|ZO?E(>*~IvrQ!PBag)!rN8rH3p``>_?Za8?uZdte6PXQa#4wTDTxJU>S7lzog)eXEnyL&|X#B8vK=xl8d0~2WJjdNG!2d)t%LXOrE;pM=;E8i;-1QMRk6>w^uwoq9|EOkL*(FU>xDM0k!;yawyP%MW z474`XZel941gs;&-<}ti6|m<_Pgf7XMfhiVSa>;ikf{QND%LHO0BQTZ#2Zo>_xhfw zs}5Y{Dk_m%+Hol>=KzBEiwNj>EX;s~6by=4BW;PR@M12o^@>ooNceKkK>7C8ZO9|g z+alpMB8^W-+LTMrL9bMKmfBy>!ZzUL(PXU*)uVTk^V*a85CAh0MP` z?=i?lJ>1~V=Y;({T|Ylt^f{hdq@Oe}is@Yl*^1GZ8wCy^B#4$dO*4JRX0pZ^ET^&D zff|NCV9t3C%RCnqnMFKUZU!q8XUtq@BhmVu_CQ>&B7+}f5QvXI!%kD!H+w8B2_DvE zzQ~$_!k`?z{cm-2AgBy3cXgZUX9bo7zr3jk2_O*l96sZDu3Kp}`Mu$*_J(hcs()v0 znssBLKKFf!mRfkXu2z=*@NsQ~sK*oU|8#BmRsw_b-`3ep@<%2gg8oUenLy$=E{V%Q ziQ+A8zL}5=bUQb@F++3-B8%a7_3U~*p_;p_NzYY7c&f4n7xdq0YV><3{6uW9@I8!x z-}K5&O~-^9GNV4HV~mAG7*79d)?O&^P&wM6?-$@TVg*@VK6~#h#q7-b2e|beXf07X z{?pYgK>lz3Z~1Ng4;0leCpE~w=zq(PR7?A}7Uh@g#L0ia|CS#Khy2eJ<^Pe*|MFS? zwg0X@J0sJrM;x|ff<;6N97#(&2br+-E#;Zv^~nmfSPMhg4NIu&O=Z@I(hHI&$!=Yd z7B=5zov}oJ7-6lj8y@R_T%N>=DLtBFTSU|=sS*JbFT))1<&zb;g&_i-m*<9%SLs7N zB;Z2v^uaVFEMmIMmHHLZpqMnMC6pen4eHaA7eN*!{}+5)@6+cpIreXtihH!pJC57_bDSqs7sX_S>bKuChQ^%BuBqSvJ z{0iq3ER=C`ip|5p^<9}amTnbK)sle_S7ctC9U9$xZ%fOvl6%GQTUp#FKyUKQ^1^+FhQgM#-)I7YX?mGGDOStPN>s zZiv$o)vcMV7kIX}XsZMEvsz6HQ_dTYN@s|BM#-8PS>N1TJ}b~n9(*nEEj8GF2UAnu zD45g80r^wSakGvR;^xr>N`kIL#E1u+L2+kAEj@`O|K;~&I$k3o^V>6BBr)93MMG&i zlHBFPEK``T7hoEm&RAR9k{+Umi-Ox1yxcB&MFD~>4)oQ~a`g4d6 zvrJ(gDZsSpuoZX0FMq0*f3%->I_7fryM?@9)|OxA!z@#n^NV0)0|yq0e{7wVF5>+9 z8nr%7fB5~$P~XI&vb_45eVAp$s}FHrsLUwW~Y*pc6n(+H4^&ONv+b?Un8jq>+q@v<%l?Nry^}&{TU}K8F{!6WX zea+gxm3~3fQ)w!D;*0{Wy#8J0!z@#n9~QyM({NxJi`*u-TUVV@IFw5}F3Yp7`VE#+bEIxI;b4J9SOBU$T@`7L3bUaH! zrp6Yg3VvOsouLg6bCDINP@Lfnn==z+PB)Zi_JdtlaZhJL4U2M>N>B37ep$=3tk)8X z2x~2{)w}06hdQx^csoUsZ~9rLr!J-XAKNU#yk#U1N2pT{`G=`fcQ386ctQmG5Z*w^ zxBTqOH2Xz1yRLk;Lc9KCS1&9;T$c0yq|YE z?h+w$VIi--K16(&WePK=2!^d|%vR#|MAuJ;@k#3V9Pa0xju$TU@8$j9#;3;5F22zr z^T!VDe$n{&_*$<0InmEB9fuz1-)3+nRlD9b`Y_8B=JFz#efneReN4i+Vg*uKRdSA> zdAc?4bN{E!Z?}f*kvr5s59*7o3f<_`T-(q=cpgl84VzcK2PIa?rAqxT2nC+WHZmFW zOI+ra_~ruJO}$`YAb~J#bbpmb`WU8Kn+fdfyxkQ0c}nBH<16fWPTc2_|8s#T0O9lq z#IK?Ev&AUkK9FZ@`?9OksOPnL90cH2kkuk1*;a0p2Kb%Y2mYIL1b$5cp3P#>6w&cU z4oivri3sLNUitaWoUAxn;@XK>JiyMT5+lZR70&D_?}WMdGrAcTMSwZmIpl<@*S5PZweA>)r6e;Y*RLK!HpC=i6fK4kj$(?W6)wlrQi3w^w zc9DYoztiTji={n6$f1U^^u*-7K9JZ1;r|wh?cCCyhL1AkcI&p3`#|y+H+Ptq@b7mn zZMNcXt!|IXb-1NtF%DI*UE)wiIr{z%bK!f^OHq2B;GDn$@f260mZXm*{wTN9Cd??1 zq8Q1|4y40!wfAWOv>@XZH{d^WAO;7Oyk|@4D6$@~IkwIgx-QALmlJ53(d%H)bi~qs z%+G~#6CiV%pLV}9qc%6Y)|op6JxK1fDNg%T)RKv*^_MoLmo#jV;W(#7Nx_-Xl$4`c zinN&d&MZZF!xoeu!7ffy^gDA=1vSz)^VDUk0ulQnW{7@ra=+>9CZ{#jt_w;zO$UKm z`VhDDVD7R;bS8Vj6p^!C&)_U}zcG~E#!GKexb-JZk7u_rK~EbBa@d;v$LiJ!TQeDd zxyvMyR7Wy*|9COOdRxpNdm&oK63|TAr8;&WZ zZtrpNoEgn}nMd79h>{kIXdo-ITg03<2F+KG4;j+dNfi2nEMT#xp}o&$$SU;3qNs4n zoRBChqJ$(7t>9>}m-4S7%`q9}6xg4_JfNU%bBv!hi6=FlCk|h{zH5?CpR-BNu9daU1zw4fTroCq4{ z_sJwfgBR>lV5*Iy>u&Rs)0c_%B+m847yC))Fc_5*YJIVv)T(`}e-EoajbdV&=i$ z3xi%kJXd-6N*A@XnIH2^-?m;WMpgMwX{5jo?fzQxzy3Qn|BF0ay+!gv4?L5?|n_b{)^7 zG_@KoU1>h|D9!{D>8!%p&3s_esi~G*d$#c)hr}&XNo#&dOS>84 zH96R&8$B*cf0uFf23@Sm<|;iOhiWv~45W)kGTBRFa|$7x|=O8pFL=Q_8bk%@MU*Gv=naID;LeV6q*;q?$1k`6P> zau)YMUQY4r86Xm-fzCo?VO>_v6xRO3N0g{Y#7|psV(o@aqp&rcr_Khj$Lw5BlvEIp zC)@Ek_Y#$#xMCDuB7AA9@Ff0~r^n~#x3Eh8Nykcvg!^znvaYXH4X+9_tIm`+yyK#5 zT>brWnlZhYajSt(k2iNctZqBBj&Unz&Cu+qAVsBiqW~v_?7@ocQb0o-gOi}l{bnhz z!~c9@-%$;(rbjab%>9$SW~Gm9cqbip$)5ZA{Pg`j)Cqnl9fYl>MW9cx=rzYfhx)%{ zH?=@!*b9HNr{9f#xWc7h^rblG)VWMf36w|%NX}8HH>qPV zEh+9tj6pwC4ukAPp-i|UQ$;&CPbj}!B72+srMO!2HTP+%xn92+b1i?f)(L2w%#WaR zwIGh}oE*<5RuH+%C8=PSo>&z}mZ8o%fr;mD(5c&201>@5-Kgq2Hh&t3H@hEj89=a0 zY|2+}l?>9+DDfK$-@Zkvh&P#GBHr|7<&_8GKeC2F{83nJn>k>c6egIy7z9fiBz>(I zS5-_pgP9V=A&U5K|By7;wyL?S;)%8n^B0Aa%*Uk;=r9NMxeZhQAIj=r$d6PLlC0UI zRM_&P0C(?XIv_tV40d!WhY2Ageyy%20Vg2tj>Y1&$3JoPpMJma&&pO)FAp3xH?=$f z??yA)oAX+dkr@O3CjW!?x%uzoA-km}ZtjtXV&+Sh0{n3v{1NgX^;KDTw?4~81zy$v z6;et5G`#TVK$ZjfbtU{719GkR0e(&J_I!deBYxVm1S>**+lxoL^Z!EZp>?>>3$xuL zQMCA1!Q|bJz>aj-%+`s?E6an-eFiq72Vbfhwg`t!pU4!3OXSZCw40OEw*}k>yTpBq z!#dZvyl-?7@3S{7Q&2SnS?6W1Y&Rc0E4|a~%7Y8p2e8g7$XY|zl$W)p-E8u*rWa?| z)|O_%&Y0{;rJ0f0wNts_!a83Ks@o20S+6a6Bs~dM6L!|!OgkxSc*3&gioRjmQnq+P zib1NX$|dE7S2Y6jO0o_9a1{8l#Ku)|f*QLY9k(2Qp_iP5C4NBtoyz9K11s3oEl9D< zag52s>%~dH`H%2bz0;Y>*v29&rX$X%M7}+MUy;ssZ`lZTX)I|b7mce_n999j(wDoa zJs*wz7q#|mPfdHw=c1?gohIF)CKOiS4P9G6ThBE|fAwWM`R?397k z>xq_cS5v7#mLGRZa0?1(o7H}1r5|pLSo#(+HtSDR|(u4U2SYSfb zH0*%su12nOCEa&3we=AuA52C4Iu_rgY?Ql1y#1`_{tu&q&d01VOq4C(IpqPTNT{-^`f> zZ9IJSU&+=_6jp-KX7-=d9|Uu|FUDK?E+%pESrDQUS@Lz z0oDBo5thd998{XNwqdy}xgLg)z7Wmm88i|+5kJmGs^xBwV3)XNaBh)| z`VMB~bXFoU!d_l}UHG{-6DvVv$(eC8_P0g5B-L_eRgl#MNj6F93?}PE1sTk_=XmRN zG`nX|f+-y)xg=ea-4jS3p4~Hq+bBkenL`($WGV?(kF)Jz)z+P8g-AtF2C)iH^TXcs z7MW?J3X`f4K2&sAk2 znL?~#QU1LfH!G1O zSv`b%e9_Kzj&?@L=*#u%HG$IggZhRDS6N@$Ze9Og`*BgH@yB%DpDcR9hWA$uPtK%2 zy%Mpqd*`Zgg5x+A2XTBn==1hMh0anbH6IucjlB8uJ^f|7^Peqc;cxgLJv7-$?!F7j zMvDTrMGHhD)NYo4YMn!qXGpFSsc@_m9j9!m@F$9LizN z=tNPsd!0d?T5CZ;`;Q+L4ZX8_bAK7=p&j|zrD=k5o?6k2iBoF_F(Z5`$t_jt7pO+F@=zmZYN9G+dvgbEVYX&=UplUVW@0DI4o znJoR1su=^M9gg3BLx(^Z=<(VfTC-JWF1^K@R*lrk_Ab!DY^b+vSmYk%w(aK5U++c1 z<4It=s0;C3PE-{3-1h#^olA&^hvukJwzm=!ui<@^O||^1$s9zs7Mdq99;ed4HnaOR zArc|-ERj})t{d?de(NxQ1Q%87*@32eJrd_BU^_FF_jyCq(QYZjUre;lx8l){UFDM%Zts6iSIc164Ys5f zn~i+lhgI^y){n|1yScIz!Or`5x?8{7OgmKJ>?Sd5-E)`U%;Rj$EkXizYjBhO_({zi zY%6S`si^6-%Y_OJl7Mu0pJqO3KM1K{d{A5za{XLBS~)=+D2dtzG9|X#1G-^X$@F?# zfO<*rnNWWWpIE-WR)9$f47TFz<>g!;ll1HDa> zjhmlP!H5BAs2!rMvzwr@lHQSpiZ!x%v=wRaCfzV=!``<`sR%i;v4=ePere(Rb9QNO zc3PXd#jM@Jfk>g6@zPS-*wiXpNptWIbvXLk2#*s~+AyQsq(ics*-nzB0(tv`J1yKu zMX^Z2-e51ctWNG^Y>LMinHntl-pAAIN7)3($M&t$wRc72ca&|Xo|9r87gMHgA?Y3^ z3nLAK!6G92H(26}#1fU8u9{lgATU;ie%(ncj-D0}rl_E&S;#M8M(eOCkN!nb0qjc> z=AlAPjZ+FvX>(CmueRms^^-Iv=Jhju0gVu*tsIlfi+l{ETVX`f#43q1X+H1OkgiwB zcAPU5BSt#d&bRZr1;ezAy(*|=O2Oc#>o!Le5yDDq!4 zi1r9OTqlU&LYIbJb_brHE9_9t`RS2&G$Ajt04YnX7EOq2h>40OLiEc2v6}(pGHo^mI%0A`&J+_U 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

cqFI`E%WXQJxbBp-0S|x ztq>?HL>Vwlp&)KYJ5&)IX)N_2M|VyCS@Jl8P}V8Y8zu|s*yTxZ5yBCfI4eZ?@XrIJ zB)%5SPUO3bmW^in71+0Haf190Qr}+rzwG5_w%ZzS3=$UmLYB7+u=b`mPEdV- zY(^%RWSqvGU9)DWpd>D^eu*p3IU~$M;mae}>6CEbWb%Q{Dv+)AV+32>Wyuo9azn)) zF^(N-wBtX_U;LVy^$$wTN`7*$LLFL+a1IJ;Skf!kby8-d8gGPDGWeM=Ys9C?ORa3M z^gtB~mY#()u=Gq31D?)r9??xfQa?zUwK=p}7_^$`6&$2*lQgnj^HC9g=4dp)GrZZP7L6SlR#(bsgx0EM0R>{xKY~d(1MVBv_tkyk2Cm!%T&#fB*Sk@8N}(0 zK;9Ex@+$A^?2(Tgw$?>&7%L1#5MuyfENteWwgDT0MqXn9TU&LApfqK4wiM0?OSNq+ zg;f|doJSJ)hJ~e#gAU(mS&MdeI zHnEM3`4H!FW>s$^Bw)UCop%@#BNB)t+~Frc_z_9C$xmQh8IZsPo)=Y<;9s1iA;^7qNhqPuH?n_ zC*LlwS>B)`nPkLdZ<&`n(7cH+7GZ)hu97r3a_H{tz79QEtaly-%+;QwAbCB)am!wd zh9PC{`;H|Ak;`kz@x`(na*pB7ib)e^DUm=iz`wf;{tqPgnRpXBi`isezEh}_F3Miy&JvSi0@RxUtNcXqG$SzUcvH*j zoHB>05WvhPp2fFHVEfKCfl>Hjx zpfvJ2vI@mZHuyEo`M#Za&LEw5Df4;dA0c8k(_rdlR($kr+o`W*2}p9X+A+&Y?;TYA zW`#dL<2L&*f`l5I@Vy{G8UnyOgM^4pSQjKDY{E5Of@sY1SXy~2x&0E24hD&xue6`< z4l|2~$GGpg?666-PriB0&{%e`u({1kcJ!e_p8VurNHTY#0Tx~OLSm7<=C|Fso|Zcz z9m01msn+I;DnyKKuKk9zIE-@iT&iY>Fv>__osmsQ^w~-GNu^CYmJAS}%Z~Y(R5I@Q zbYHc{?^h1_s4&T$Jj7jHU$}-)17SH4@5QiE3-2v~0~at5+2g=?jU?(--*d$GC}**|lU0&v!l--q#3NL$x8BPD@+ zS}~`tRvA<{c>}*T>RQiq!-xLmw*G7VvNwBW#l~J%+lqyqJ27n{KKTtk>4LZr<^?vv zx-S^`fRa6wj+-;OFd#xn5t`5gH$ALK5pN+=AvWPVSQCVQvDwIlAl~kD=2T}g1BJcr z2OkEuTZb_Hbx}vgYeOJ;RF@JOBOc=(`_G56ELjm#v@mrojM!n<;Ni&KVeZklF?$N5 zIH^}9D)@1h<^&f+8THWS536zmm8jF1&nX(M=HcBXG{o21Z-6TVg3tf7ndVn56G3QE zj2l^na?v(36OvIiBU2zjAJk!1OTgPJ{6#)@;3Q$X^y`O8T&U&WrOBXSb&N>LZ~4Ey znPum*J>U9UeYGqI5!xHJoobJO{GPoX*6#Q0K>FsK?pEhEp%B}x|mT^DLVb-R`g8&+VI`R$dt*IKt$R+xWF zPb0X|1AqgVZLW7dx$|(_URjSqE&hBrUkgr32jE!}MGz2TZX}`J2QXKhXNIY3ZULM$ z|5_r0C#N_8bk3`!<06D3HcxB`v3q)qzl`vdFGKseqb4n%-!*G~_E3)2ML5JQ%KLJS zGrVx)caakobjuAzemtl@)TBetj~Mj1*y}2&(Df_gi_Q$ia*2HVeA#R^%SMs=yo)Px zBN#vN5jmh>;~6dJ&Mb81To0!@#d(6hhuMClf)U649w+qSXH(qY5mW>Crz!jy`SwK> z*^>l(cB0$tP}i~f_RA`A<4Sc&FOfdbox8XYmcG#+sYQjD>=bAgk%>GkHd`!~?S+Lm zIKq!3?fuRxH%{K`_p5vTp1it${xy63-nQ58fA95s%bI@WL0|cc(?GYuQ*Qoj|M+>< zf5e7E)!wq{wY2*If?+t?aW_LIW-qt#jSFI3YLnj)z8Qjz+uyO3x>x1y;CDg07wBp;Z6IwVHkI=FF~8Z5|fk zVYk#=q;MuE93XnsCko@gVw83}`_bkQg8EgI>c!N(czsdkRW6078RJs=*MY5VvR=2$ z6H5kQgHmV?BU-ixHBIYXE>m8_)};9wx_d2>%Q_uFmSMeTDRh~_x$BTXaR&we6W&t8 z;nP>O9+@C#IYQj#2*OoD7JgmQ$F?J<^$wM~5Xh-7UWgG*h#<%kfDLekQ)CH^kXZul zvGaQ2ieLfth{6|{9cBTJjF^OJs} ziz)NXpv)lWx4`TBRjWDZ^718F*8CmwHt(r2gZrfmb#c8NkzpjGHj1UFMvkp2dcVgX z=MBFXQ|8?rtSCqqNTH}vYS}5g<-g2K>yt1`6)Xszz?Zw+kvm~_0IGb{SAVFe(^5}U zH}_p#qlNsT4}_p8UIM+xAiN<$|35DC$2s2AqgLVDf|LYHn~3NjRKpa>bgfK`QWc1b zI5R6+S%81_J>_7cwRl&$?2HiZoy?C*sjo^ZilKb_WX4k@+Waa4eqL@KLGulj&J5?y zcSbO9J~T_{?%&T|CH$7Jk% zNpj2#=NCnG$k*&h*iB8vO|g4MSaheSKH#y(T)nejfX1+1EZC(O9mj@04z5h9o|(Sn zuJ*LOUm%Y&sH_mI(w;zijq!)(FPsqymqfoo3|GAZpgSMy&tdCsJrbt)8A^oDgUzNObi2=)Zh55n< zVlGOSRFEasyIiv1PrB8d;`1+ZoL82kjU26J1{W(mNuT$6UZT_J>RvIiYc*#*7V=gD zu028Y6U-04Mt3qBFwvsK>3{mH~32Ej7 zHIGCt?N}b=ej1=M&AE%dfyj=wsHm0GaJ&bNL{U#YL-7}S zue3STH%5Zkjkd`a&!ll?DxT;o+XqS}N{mgL<4|4OABQJx6k=24P_{2B5t%)bd|PQw zm#$E5q#~Iz`&n?GFtxJli`Yn+8*8n8&HV#cBbuH}r4gD$yCzyTbYgQ*drzvz@3DM4 ztR+o6V5%VZOJd%;uq1^iU4pFj@jxD@0tb%9<0OZ)UP)^Wb0|kJ=dgIyTEYa?>pI+6 z!4iO3x+mzsD(7z7f!p7=)BdYyCa4goLHXmPe8BI8a6+OweO$bV<5T@h>}KgM73`y( zhX9%oZtfCdrcV(WP;_AJhd6Ojv&zJC#Prjzb-7n-f?7@HV(PKd+ZaDLngtKRIbPNe zc*Q6t%~-Eqm1UO03RH$WJSe%;FFDdH`Ac3w4?pBU_ju`#P}8n<=6HJz`^U$1B>@D+ z0Ax$|s;~BAd|)<=r-#WC|F&IqC2yyQtP}108*OsiML4T-PVoz60u0uBCFFpCx@U!( zc0_Oayp%aJ)U-LOj%6iWM|*qcruJ(==a>>YgQZLqH_~HEY41xXr$hKDtu7^sKmurt z#Q(*B$=X6=Fv?N6_4QJcoCd>~#I`w}slZpZx$os-vG-8nZL@vc)yCTIz~|qy4Q{98 zl<)9|R%&b?Wu)zXwgzEGBD)X-y|B)Ee}aIqQhTj54lX zppZB@YLnqJ(mIjyFAoX~^RY;H1)irp`BmbR@XHjoxma0IIdxv^!|6wz ze?Ux-rSL{T;Z;4|W_qxxm#KgWBDEL%Qkj@v`vYE)R*JZ%hx6BjE3%7O!7a~odaabh z^gM+S5bD23JBj;$fA^P?=E<=C+XB$jdi8*rBBzDj5rn>$$PmA%VcYIOfp-?>PR(Bz zqk(rywbSAM(T?@f{uN;o1^twXe95kAp-v5r9qss*&|hl=OrjgY`9JMJ`&<8c@=T8q zR(PuTn@=K7j{b_QC`f5A_lE+cVkm?~W!@TtzdZ2>Lt^(P%3p>%KMpbu>zj~YErS4m zRwupDj_o|9P1glXc9cq@t6(N>ZeMCW7AZ+x>vw1RUpfLQvxj{U`B>=07>RJTR`h=v zC?s=Miv{+tydSTKu=or6gLSE`Exrg)p66HXv0Ejf#Cgg@BI!D;C4gNdrh-Ly!UwZC_3+a z@_m)}9_JZBFm_fbnj@3&0O#KUN-I@Q#p?PTB*;XNs}UGCrE<+oSk5mwCc{1i@2H+A zOPHrULE+_o;V=1xQGXC(^~X0$mx@-qTUO-B1Pe58?iLu#sRNzCq8Zl)$9w?u$^byf zOUnTa$c}a5L6N0?kpoLbe0hTQsa7woi*>Svc)F)9LaKmpxl5Ki(vdaD)|_*`0FBb_ zZEuq#0!Z3SnIfV>t;RP(UZC%!(IMpnqMuiVz5(15}TU}L%TAyzbGc)qAC zPYln5O()G;R@Os_;u$`y2mr@=#pp|5xFZT;M;Dgcqc_dW9p?QwG^%%34(eot^7C@U9nZV7&^@_YL&OpM5!G9pScv?|66 zKEu8KKlVhWSK*^2g|FQoJ}|=iN09sHsyb2M{n3tA_|T+w1lrT|fzw_j`ieFMXbw8w z+oEBmT<82cz-XGYiN0VSCM`z2U9!AY7iO|IjI^>Jo==ySjvAa7D9K@iPU2Q``kQt$ z4t02&@s~=FRorn??59kt4h-#MR9+2oRQ1Yc&z%`+#VN`9yQIOgts3FH6=WIK`zGk^ zY>rjtPGE;l_#-pxJ-yh7qTnFxzkGfY^V_lZAAnq$n9%zp3i41#;Q`T34&f^@Rh(x_ zEi#j4Mi}3nLHTKY*Sd4#qW)?QS;eIg)X*=;nATXQy2~1zqMu*vFWwMoLe{O}&HzTy z^0jGw$FX>dEmxhpy9^>r9q@j>Ug1$@t`iB$1h_xLZ2%#mBAS=9xrfdbT(^5f(PnCu z4~T{?a-J9?9KwV6D8QNG%!t)!L{y`3Muhsz6kPY(E*iqySxcVYOIQ+NJP7{$SR(7=7QfM4blOBJ#BvCTf(6cx8vfrTKb2D($X?qH|Wf5CRttL_(U`Jk``=ZZSHTQBl(>Hf?(Rw#5wlA{jk zl8cpPi_)jT=?Z|vd>|_T;tp>y$=9T|8mnyZK(fCXPOgX__EC*P1X2~lb z>Xq^c5f;a0=Gf$E8eNQ$N?62@)p|HvV*fomRG5wWJW`k)>zOLD68E)g?3;3v2LJr) z!pxNx;z4ppi_2HtzZ2vb*43v4OXNGsdqTl7weTh-AQV(~*?J?Ta=FHNA9Z7~n5j#d zu{1JeF4T^VE$CK{_;?VBb|gSXgnAhZL5vNd1g@T(G;6;t=R)+Q5~r+(%WTCdbJX=d z$r8|P6+xNU60Omiz7+vyJ^!AsutMb^-wpJ#RrFiU4+Q z_j$Gko$GdNrfXmwM*H}`C>cV8!Nm9GKk=M7><|`|6;DKAWI}A%Je;`~7||a#dO5PV z%Ky$QP=`1AxTcXCdQZM!iH%DfmC>(lb~pR{#ma*l2BXgs(uon;fF=Ju_CPG|Z_AV- zh*HO2d1y21+pJ~>eFVSFL9DpS*lV)w+@N4aN6qDuh3m!mFcaPgrQxZjW{n^$G?iM9 zdBu0syi~?#)})1@>~?nnn=Vv+gp4ppbgVAPgvn+R4+FXJfKp>^Z7ilpPVq)iePPZdR z3jW~8^3LFVd=>|5!*D zaiSFMc!u9?=0uPZeVM(#qKy1-C`wgZGOyId*j$bfSZ3y#m9E#9u+NhyZ*jd;BNu|} z_CG1Ey=U+WP!fOOtL>!{GlCM=`Xzqul^81}2(FkmPb)pkoFH6hP$1?PSmzZ$2&xdI z^aK_G>rc;>bWU*lHol?yQ`M zlwZ?PmL3-<)?yGB;RX(B9Q8SZ9_Y5s>{}KvZN2;+gFdOnr(g1a;j>(f6CWjB{zzGV znQhQ}yJff3C)+p9qRs&GM)(@$B0@1*^?0C1iHjP)bTE=(` zrSe-iFI01n8u3BJ`l3V|ce=|U4KY^&33-@9!hlU`{i1iw4pyXU1u1WC%2)6{S1GaH zLcMn~@MZ5)CgW)>;NHSt%|B41YA4d;IXLWtyyy3)9|!pHmu4r;yrjfyx{Cb_4}QG7 zDLljaJi8I<)$z0O_0IJ2|A7ZT|Fb-k-`}m5=bz{2KUE&Qcz#oOZrntPLi7AW^P)oY z;zF}iXud1}p!MnQS{>~XRmq&AL?aWj3bjD1xCQK5a8;|B7Nm!u;_kMtn>v_~$*zax ztIZr7ydHR-ym!x>Uzj`JO)n~>7P+&icd>h><2KLFZ#u9r*KyOA6;hXdCI8leRZnc* zJ+P^HMf(ucYxuXi>ZxAa}+V&pE)}@nvz`q}8@G_a{x9$bb@2*yJh6k~{ zQ)2GW!uab2rtOX$%opvBbGsL~PnM>R&I0KlOCvZ4A#ACQ&Ud^8>yZd~M7kk%6AmQJ z82?>Xyx++}>W9fonmu!+2ZY%S)Z1cZiYIT*Q6waO=S}Mz$r{2RTKROf{z?cLX#JHO zX&z$*@cfnR@1Uu)J8O;5?RsGVxUleLwZ`Bk%*_vkY(kqBp&O255Y@bEG8_pDn3P zDx2&S0)epSgchH+a`bVU?LQq6mDeI-sSie%!yLJIpS@7(h(ibMSUrC448cQsbQYr1 zEv?kqj#As)s_C+R9YgvuO&@O-oQ8WL?w15FNAmIL%}NB$`9Wt+S6>Qr z=J)@gohi4G{6UfNQW-yn7wA{a-MZ2VI(5#f06@n1x*d%xEC7{b&GV;%OxKy?Tg*-V zjH6UOD0PZoYGPR_X*(OcY;6|@W5jFLE|vNwNI=|MblDA)r&jXhd$7thg&+^7=kRlz zM~z+yOW%9?uRQ}r`A|cA5n0egSwU`g+;S*J zypd?fTzv?^BpwYKqBQIyBx6Z5xsr`;wJewju{t|oT!*QtWLrotpn{KUZgw1AV`1l?Q zzI51Z0AWukn+h5!EmkpR5DEM!wWhPUY-GA?rUq=eg5z}hylc4xY^mvr9F5d`JQJd7 zN7wX9ra;pULX3nMzCKrw$N$o-|AyKSXBhc<7a=-Q!-zEQ0b~Y8YzBkdk6Ew&G38263<3Kj>eUr1v)H-U65}6#uQ03)5Qk-uVmi8EqT3@OS^n;a zWGPBWmZF4YDN0BdjvXWB6=`FvV5F7CBLTMzlIT-}yUkK`zBqtUl8`K8@#?_rI{%Xu4Ym~_gQ!^(0HI~> z@I=k$nfhK-mL1tQxZeWjOPR08U)Pu~$T##m)!f9B(l5X8z%Yl72ix&&oMNKN8w?ZG zHG+6y@`etxky5TYU0yJC*^T5riPzP?(~j=_n0}`nxv|h+48gZvAf#|(%>CtSIikOZ z_f*%wYl3Rd7*$DU+y<}o>J;Url#nb^Z;RQj2uZzzoEu~yZe);HEE2gHWNe^{T6dJY zPUIr-F|BdRWd1GpLSlU~HkX8OSqG%vNkXC)MtutB(CFKBtfcrv89}kF3$K#lW6{Lj z-K{~pFZBohnisX*eX>`op~K+8e?wLTY)vp@+f;azjZF>Xret7O)Qxo%Fvou|(CQy1 zh^X2?Bs&SP*ubaW9I5<780LW#mph^p=#xZFNov=&g=04@*tHEVTPGIolet~_!FBqI z0-`aQKvc^-7SD7oX7fysyrLZ!OBPx~ zwp#T#Z0@%&`$m)B4}if+ziPR(jM0jA$lX2iTfh2Hj&*j&{<{P=CRyw)(7487F=v#4 z)vI&(P6O;=C9tpBDWHexAbFYaaosL%3atNbKWxn9e+a#in$wYkicrE zlwRp|K5oxS++n5KdE#vOIj$qRw3J&SlE;9~f!H7iTC zJR!;Zx;F%P(g4=PXvcSWAs8h~d2c64f+Lf9VkvcvKoBOuIwE&V4)kATFOd$A*D2A^ zH%RxeOP5)Brg(MV`75va*{PI`i>LKJ2T4bP>qI&ZRZhDSe!Ne;dN4H}=d?vTKwU|R z#+J!C385V*4LVsh%;dLJew5i-r!IzkXRB786;cR;wh~w@DN6a{KTVeQ&atyMS; zoJ&rT;>rLxn{>RfMV3aM9>#UZqVdeIkJ>#+y@l@(k(hse?p^%s&}|V=Q<&Aj|84oNh~{ zytocBbm9e&iCL3O2|uYf4Sw!ydas#J%mj14l;jC>< z(a*J{%e{87XDOQ75J@c|36D)6*XC`CoYgI0?@8aqy45NEbU<*o2VOTxq5?|*VzX?9 zAOKI#jS<)Q;v(N%5TsQv(9+h)w>|a_IYi#|~65Q~&SRmHB^v z4(NghBEv|#0>W@Qe@3c|l;{5)Swin81peRY!>}x9Mc%MqqH5`)>-qLs+QQCNoy}em~-5uff@IUDIojVrqhfF&TUf5Gi}vR6mOd0qXwUi=O@}RoaHj zrW@KjJxIU>ydq}jx;{Sh4BIXB*AP!HlT&Wr9Se?(y!)_oej<^Hlb5whq+Mkq1d&na z4K+*NV%~b14xV%uE1gB#%Kbynm&U4p=y!fC$oa0`bOgvR{7v%v{-Ni~5#U)m!BlwN z8(zuZ^p($l0^Y_ooc8&fX=7Kr@f^hwuOX$Z>=qQ%!IOMUQ+XveoH zO%oHWzU$WT%sfU+pz$Dwd}ZI(mEOwoY2R}79oWGex+Zv&l7;o|Zm&^9EDx4;E1O8C z2n!C2)S|V{6XC>4EyPVnp)Sk&xjqC{fYB`&HZlL31+GNXLG~>-lDGYH{M)K;s1<1h zi+Oq|LL(}22LUyK6_6P{Wlxa69cH}?wMPQePBU~xpvTm3Q6k#6-o#p@XS&c2mv$>cyS@Cg_77yzq`COITt-60k~89=#PDrgI7D`?~!pMs+u z*Vwmp?mp=xC-gT+4&S$ZwBuY0wq9hl=QeAT1*9B&DK4K1@-V+b5p4Exzi8)Ei$52l z9b7t>;sg?4WI%RV39=r8&7d4}NRe$zGTp4O#t|RLQ6`L|eKW08=qHlQ;t|X-D5q3N zY!if>9&^OEr;agl_h0vdy?VjC{q_elSeGW0v=)X5atFMSXVtYEXGimZpZL_qbaMVb=qv zB6q0sCST6kqV&1SkyQ=#W5biWk+iHkFEMdYHp%FHi^{E_F4t1Uz(B4f5DIAc6`mLp z?aY%hY5LUc=Cr9{Jx-gi^Vi)b`^fR;cAmjh$(j2Zr;r!ele^B~7y^?6xiHjVrul7+ zb{r%b&>m$f=b5ig@+MTYV~8Z5QQ zM}HZRrzr2JZ=wXi80nsM!$+vaJ6`~+T6!#YAY~rqvt~tPeV#R=^7-D*=d9wc8)O4mk*Z{xUF=*6FfO)1jIP(ZYPhP1`i>2fvBZylCNQUdlKD6JNxk zB&idrW9qzC5wkg!5gfjvxT|c3^+S$m1}R1M)-sYmi;WEmHPFHxW*4+6VVX0HdIy99(tt?za$@4MsGR;Eb<=?h~6aJ4HJqH zDYN}@X_%YMMq_S0bxZ8488ywE(MBLDjQY(oYPG3#rxnkKe*>}-b4c5PK z-%u|g4oNj`Xrdb>5T;c9*oT6bthIC8ee>5+@d#MjY^|6jT-a74WfJZ_QlopySpm-y zCk+$Xd5Et?#zaVA$$iwXa(JuB(-Bq>g%TF(z0*x6$%xCoNS$)9R!Tr9{0&M4T)Dz# z6#o<7l5(|xi}gM6%rm_o{-EFaaqqYd{eDw4^o_HRj`}j+ee%pcXNVD|Q~t&hM9R^l z#XE!%)|dr9;i!CvG!w6;&W&`Oqi?2VF3gNGu}$=<*ze=~#e%h_W&jt{5(SQxY;&a0 zjt>UYa$l%|Gi+;I(3I5QN*iLjJkAl7goS>XLjU0}p?JBGbq%hN*w1Z{vvw@yIqAi; zq9xqb980D$!wRXene|(F7lHkEGs?uTt>X9u(-$N2v1I!$Efn4_2Cs}8!v6t)1_ck4 z`6X~NL`LhOF8noUjWxm1wRVuOlyJ&<^Dz_?LwVKX1JTl20C-rW?3QBCG7J42^ z_R5d=vsep=a|@1acc?2Kh0l12JTKR%th_Iq11!T@GQ&*8Z={)}y|EOK@lBeGXs321 zRt5P@a&i*tokwH*_syU3{)ON@nvO%s;NLtDclFvqT>JgFpdHlH9Ab1-2q?_$cc8d& z$Kv5WZ3#YBKeF@B11qjyslgIgL-Jvu7kfepfw8O>tClT7Uehv*A);UZLWzi-vosBP z6?xH`A90OBZ%6%sls5A@n4P=3jgz18CN0nCOYMgG2u#*>iqh;_RKhn=i>+a?)^Lff zp;zplIF(&@wOsm4nRyE=C$cwe;uO3kC}>e@@Cts5g7kBpOh^3SzSD9uym zSmhA%YLFfd_T9<(*STa54k>n|<-Yw_j)H9jX*QO8xM|O_{cWTP?dute*g_96PI2(n z=3|{Q%YUHrN5v8GSolL;^}Z`KER^{AxHmAWB1ZgMYzjo>1J|tjBRl@9juU5u+7+L&!VYCmJf0iSW(Y_z^+~Q_W^(UJZfPBUo=%5z+st-^r8aXhe<{R) z9ow~q3uNX`_@Ojecx{9oP-#vHf8dC3w5~XC2@T$0_rnE@CJW^rX_jdPmNQ#`0cRfSgDvCCFMp*!XFg#+4|~g*Z;$~} z=!Yrv8lWp@exp-3bMGV4l_ky`v+Oh?ocW=rm9m60Tm1iL{JEV9=td79`dG`K4~Jgy z*Q51*I)7fX1pcgl7V*?-{`v=@2z`(yH*|k2a}y)tST{?%^DC{+I0~bnS%Di(VbSI{=`^h~|b8njq$-*K*?gmpZM#^LwG$T z^}nwtG9j7Us?T>GfzU;rzpGwub@=VE{)6m0GiRh;_y{ywTE-kUK<~VeD($gw%=2gs z-~d5ZCCH5vnUZBmc6^V2&5o}GR#0d6;-)1Y?YN!pPny}6$_hd=ns!AyWS=KOL89r6 z+!5yP35+<#w7CO_ck&mRr_(YQGa>)FLD`|0^|M7qL2O>EC+BYSjC>h6EjOEaWSA3X zBM;0@7#6n)SVP1XS6o*xcM=uceL>kM_80q!OMY7wZ-0MD%xp!^1T;w1CdqTApC{`G4iuHsxtL!2c<~e= zWo9foLRKLO8X4`FCt?aaJB>*HgG;>}xn{kkU~8!AyUs4;+CZo8aw}Nc=JqXgz9r1e z`_*DsNc~mSH(fLo?o9et7Ko*X33SmSj@O_qBrWoiK#|L0g_D?%wRB%aUt{JP3(^ku z?jP%5+ry4=r9u|)7@NRg)>oV-hT%`^GAc_EMyFEs*+CH)j3f~LQE{PSoAA=17C9IK z$JcaIH})0UjOj{l%Pa;ywOQ6{>0MNvCiO>8-`l{3FWtswPy9jG@ToOFV|&_0IMxfC z0q96~n_uB)6t2}ImKk-#>xJH%wnjTXC*QB5;Nsid$a1OMMBL0d+k+mS)+^puTqk5Y zkCk~Lni3JFjNmVf(b|}s9)9||5TR|cohu{ zG*I+nJl z%+KX7)8|L>&6F8$zN0C-&3#@#q(Eg2?lg^{>-iej z%n#elV@sLulFXuhI3=X9;-+3Ca72h2;>a}ZolUm_O_Xip!JuBq`CMg92svcxl1zt` zGU3FFLrinF>Ny|~vV2LhR7e(SL0B@R%?V{0z9JdkK%8hZ_bLZKDxq6rblcZ>Wl49M z_Qsm;lQl%5OfbDVnV6U6gmmL)r3YoNHpaO>C}VqYj+7C7Z=1P#i7aTB^4DL`xaOBT z7R1EJ2lZW>Ir=PtB$&^3zPA^o0Rl->B-Ad3GBpIZHV`T09hg`Ih?jL{!Oow(WCPNbDMoldH>YOzJ#KqbHtAPlat4bR*Q|9gQ zLXr-D1tFyYt7;l(yOPw1SU)k(76q^_R#=U|;)NV(YX)x(kx7MygF>>0PkbHi zQ2pup*WJP0@Tzzv}!5<*FGuuJ(XKtt>~i;=3ES2zP4Fi{4V=DTc)U zB#|~xzU%jo7<7dfw%}lOvmGP$Za|S)u1)6JO(e|%rTcex$3ot4PtKzU&D#&d`;xjJ zzU}KmO+qhY9Gmi^?=pE;*!}Rgc!se^+qiK3?GD7|h2}lKH+reu=cvvUwkbzhpb}8eh>0INp76-1GCQ zo|0YQtWaTj*o?IpEbve$?{L*m5(b=MjWzYG95b#b$;H>I9_fR>JZBMa((9jX?xo?T zcUJB%Znb_JG;Wj4b6&w_>N+!M-SoX%H`@6U)6r|-gs<5Kj<$Y_wT)b++Fu(f4D%qp zeC@aM659DZc4@+48jI&CLhexa<)ER{LxrVbbDYIyfsf8J&q%|>Ar|+a7V71*nAIO? zh34UV6btE7ds)Wo){Cj`0>3&b$cFv7-)e6x=&v7!oFhz`;0_ATWR~r>F4plvcGTK^ zh!rGmg+-@d$&2NG#}{xF@zT1ImFvPJcRZcjHSUS3l6Mo`f69I~)JlY=P3dJL*G$51 z5a&k{glThS=ceUvHx@YsQZ}$`tXo{Sk5)B8vf#sr+Nf%`RJDn!@Cme)$`f-Ca@}9pJE0utUg3)uERre_IE|ItCCeWS?@YhkI9PLi6}Sdqbgp zf|>MF8aR{7(vhZ~Y^|Qh2;&(kn~2wV#|wL;+s&6kmxg)&JpLj5hhw3fQ_~4E8r{`A zUhb?%Z&rFp4t!5d&>vw@wn}n6`3pX z91!N@mTuVyr4$J)%kcpxWZWWB8wpz9URBvFo2Wl01)yHFwJ-LznOhMR}UKgzYO0U!J>Uz)XcJeym0N6Dd0XDr1 zSQ*kjzU_+diu{UrMRv)5rImqu;e4PVwXa)N%udj>Qe^?@sy{(6> zP?U2-0OuO`RGqoC3{Dxk*50>sXL{8D^)D1}+R?6&EV6Yh91*wZG(c!+VpfZm>QBhP%^hBqFmt z^I(jbv6yPKwCa&+c{81|W?oD)A5yu=PA$c%AAeGOQu!5$ifpo+hW62^i{?0y{4`t= z^ZZluVm2<_jd+-7DaS>6++K{+Y3T^bgUx|^W25}WIu9DcimE+Yu1zg_KP+h;`IPs5 zd#dR@t{Las6T~h}xLdj1c_)=txRuhpuGxv)`*a%4_Y1QV*{Z^{dgZ#+++VXmS)O#z ze0a*g85ykA_-|0kG?LG4u4kEn4_CW$6996X6Z#`nUr5#?gY-1(5oJ%a?w}MPm4<#8 z?r4d-n?Z^Aiksb26D<1!Ny@z|oL7Fh$(q6ltzY@=)RInJezW*gs;m-mU%LJ+HF}Uz zvCbFV!MWs2vh5Pr0HRcuBXo0& zwIeBSkZ1q;B)bFA?6F1a3SnbJ0hAf+rDH;bX6J|E`TzyWJ)4mM50RXkS@8g5%U4q# z9wx#m5pHmZdzr-46#{k-EHyZGYtUfpj}7rE;`}%t8fEJx1qL*RphEs=*IenU;}iU zwmj^vPIMOCx1*hy1j$gT>wwd0i{7&q^Gv zujiR<`nsl9ESTJC59F;D-eCfpL*eAS7N^2uZ=vFU--Eha$bdKl&9&6+{1c8!)fRS( zS?R%6?XhjktK=wai`b%RE8Uy5O7MF|V4RgW(!+0}!ie{NUUDM3gj|bU%RJ{X$vMNz znKZ*~&ORsYe7j#QeRI>!tw9Q)=k-laJ8MYkJ2LHD7QB((?K?Q_oE@ZS-dL+MAxNRR zq`7~RbZN|8hA;Z;VW1FW-va+E+qsBVB93p3Bdq48uckQqsYOF#`At)kG%h}`I68Jd zKevQwxM;BLMe)XG%u}1OF4-c4*1i6bTSBp4@u~ZKD7KQ%?R+-z`8%Hv_>6)^hVnU- z&k1}gDhE`B1`hrI?_c$x@Zcdnw|eH8`*!I5DE9^FE?FtYI5y==Uqx`*eUaJ=+{81T zDST_AxwzkXrN1BEFLQyjcpWnI(o8!HG^Zudka(Nq{GK8nje7cTRNWnpKr@cjUK4271=>OQ$tcm(ws;IbVW~do&4T=lO$pe zoAaf0=}ffMypGxmipSCjGHKe4sJ9y?#Re^V1|GOi#ey)61FpaQa$v;~C%O9|%RHGX3Ih;e3Jynby=cHX$F7{2mfqM0C5{v;v^;eZQT9-85p z<3?4Nh5b!&X*hMgOSxCorSrd)0~wg`{`PRv8=M@2v+WKU&bWZ?-Zj-Cw7*7%wnNyS zkz7A4%f&VlrqsZc^n50G3_bTJlGS#G-+*Hvg+3@X6NIo*$}r1)W9Fn z1bT}e8N+OZ>9Ux+ypC9$Q?93%e=g$~z3D0WyI~Cxv0<;Bzq=LoDhKym=I6z(S&AtN zwd@FYpK;GuJ-4us3KfPg5SIq3W9zW>F7zDENqXZelMYxIy%k3v{9tvhDWq$e$MOTc zB=IZ{$es<}3kx{^SP7HeD60rLihuGqPlv}{}-GhJh*=?W&A;h zD#B1@h+y^(!9Yc$!0v8!gkFj*+-mjVbRoX0H?L z_p$~N4fj=%PO-QIXy3YueUZ%0IBJmxR6LNaZfI+$0Z!{ti^_XptLU-vW{H1qRVj%R zpTP_nQ_Ggw7<2mZC#qw9^-PT@r@%4O>^hy&eg)hPBuDf%&)tR0pYrP{@*B+>Dzc%= zm@f+k8FT%E{Cb3sto4=rlO^Aul2TsfXIXw0C(73!MPcK_{`jUGNic14 zvLGfNp8X0?;CFba$~gFc;H9i>B7EBR;Rg{ODa?=d;SRB4jmNpHe=LCLenk1-LCXJz zAr2&qqt8wbXN7~=>HV4>n4w?N8v?KWQ#zP|DZSYgy$S8NOw*1#v@hoK)woH+g4>(0 zEww0nSv}8E*j&1^LNs2n&`P!ROBX)CB`HiutDC^3){x$S#pxB3YQ(w^mLvN(D^nW-W!G*-kjbA^~Gr zC^~npJ{WK;;bZp#&tims0nJ5k%d}0UGZkfEWh4Z2x|Wlt;^<@m`u_iC&_nRYYe6d& z*bdQgRmJar(u{%m9ukKa(?1^woV)bL4pVT#U|1}iTdA@TxKB$*8t zN7vJuzUt!WxQdCs#NbULZ%S$Zdvhs(FISSe(04cUNM?2C)6ov(uL=(~HPK4^3(d<^ zwn#lSUOlzcBNtS0{hS-^WzI&(&OlC#vIQJu%*^x_ThGqts zm)DcnhKIwTcI#|Alo-nik2PBwgS6LiYGw)3ghur()TdJFN~2 zz!Za9D<}+iPpxaQzv~nY*|7~!R;2?7Jm3Eqh!foW`VWM)q;(S(z3E8Az37I*zwglv z)>C|W?aWkU_W=Q%DilXIP!R*n`iecW$boe&q)yc8{M2BaXm~>Ni|;DQUmX2U+dtm# z@|+X)%GuB_XUe>8kHkfnmvHx&-NGTi7j~86K%lO0MWpy*)9xkv6<-{mP*`)iBC#iL3 zcbLt2cFfN10hv%X;%sA-+0xXu^v!naSFv-N>~?dtF*|B!cPM*MCgl81GRSdk-{F!p zoTTT1G6<~%dt)d_?WofI9igQ!|7)>G&@sf@NWQ1IvpbfHubWj_^>N3h+^&o6OHj*2 zg+YCzN@?z}X8?H-E?z06+b9}cZ=1(Dn6l^mWdw!pA~Rb& zw{o&5+XE;#JCgGwdLvFSZTKCH?~A!fF(Si^jg-mS{K%SQpYx}Q685WKmSj* zg`f6Ms|+?CW%HR8IFJv`sSmR`M?8#(Ksjhi$Z=MVr@3i5_x%iM(hwQ%I{RiHlT)snWx| zuvKM0S=H)KtqQ5pv3c#d%Rb_yve=2&vBUvOEOSGez zgf3zu67QN*Cok)D`qSok@}iz*?t++c-y4X$Hg{xn zLu%ATh2}Aho7PIKy2d3^Pqco71_yXL=1~D^@kPnY^krRC_f=@Q&br zfpR_7gUCQpvg&AIQzNaIXAV9>(kUP`674*T^q%T!GINF=cdI$qExs%lEh1tsEM}wu zA>Ozg!BEc}G}etaHglDtz8$_Pk{AnB?|jNQ7>RmqTcR1BkqlgPwjD6Q+`L)~aD}_B zSB_6wNkgMRmYSqf>qjCtC9Nx%E%Qrh{WUm~+itGI;R(tWQ=`rm?=j=r3u^@}(6 z76moW2UP_q_9DFxNP%I3x{l$x?+6kD7{ihO4T-1Q$vna@!F>c7!@uMeiN4Ru03QCD zt`#xo06$lYg8U_!KDAxT1mwYfX6zLNnR0mkt@-yuFeN3;>XrKy?mX5osG38L)%`-i@$XBWG6 zc5LnJ5o>3UTsxcjH#^SRs=qMnaqTl3AK7cYN45(G>#nMdWW&lob3H4l9x{q^^*V8u z4pJ=JqFSh9XPKW=oeRqvUh!=vZwiwA*SBO1S0KJV?Gx)iXW(_&i#;&==TG)vJVsGb zL79h2Fd+0JID=%l;)rk5HOlQ=Kgvaw{hc=dp;MSAo_^j#-fNL>L*e%({*wZIJ*@ns z>g-T6hSLV|pxl1CC?8RTOk)K)S|Bj`b8}fW zLt4$3y=trpT&Zz9+4~07VC$cEiu?yN6hvw{>s%^I_WbT^MNFFD?Xq{nc@Uz$_pl04 zEBLbUU)}d`2R;Nt1@=Oh#$^kHL>1%2>m|^Hg>VjmtKY{cZGH!a?2_0}ds%+uWswjK zUnK`PG_c_t1am1w`wkH^mqE;}!oGd`;zc-zia1s{p>Jq@cU7)hR+PdZ2~HC2Bx+hk z&!D^hHpJV6dEn0~11~odEcn8uk=(J?6b_PkbD6h5zWlN-kPA7@)~%ZdBj&dPTqwoz zCxrH(UrOSILRggIFrd`-KYr6|J6N9|-Ed}AbVGVTbi=I5mgt74oYvO3x?4_Uh_-mt z{-8!gH3=;#z|XM2<@_;errHYRj6E7`D?Qw@K`m9$&dXutzRejKjiyQ+U_TgYvZt$L(zT0KnpzwWokZS~JjPE}(L z@BAd?$bw;h|0?~wL&TAt*+Zb4untJdT&~xWMW-h&&A4Jb=l4o^fz8^+ZT;69%9fwM z)a|`t1XFC0)Sg$D4mF9=OYform7uV{qJ~UVZWmw06aMUV*lRqUf~S;}fQRT&+mGoF zL?ghR%H*&Bj!^)YlmQSEp??4Rmlvq{4G=;X%}besT3wFJD?(Ka(mX9gCuE8DW4>uILn z=(+Yt-z`cHZ3zihRD8kCD(pR_$eT(*OtF?RT-0OW$GbBv2)u_%F zp1a^Y8)KB;??OAlZ~G)}zXKa6+h05H@%pQkz6c2_(T-DPQBfBa(OYCkBApoXJMmBw zY$uN83EPG?GeD4S4~=V=jn26Cnx+qFjg+8=?d*9_dfe|cJSN2Q8$|BU`ptPz6!inazCF_@~)Z4TGx2y z3=$U|F>CQg6|*MtB^zlh>bOC`Ub+TrxTf8`wd8Uah~rr`OMo8dh8tgL;((}Ye|fbm zvSxC4NUln5Y+w|!b>$8}>jI)w}D zw2p}a_bp8X^X6T$(sDkdy<-~-yM&ew$fNAwKsp3PiessGp9smd?$P4NtuL&pmnGuY ze=OX{O~naGFK$`d4{ADEgA~z&dK)jfAj?x?2ruyCq7F4KnC3zN!=r)8GFkMGUN9@4w|i{Va~`yKlbpU-AzY{AP8 z@6k|M)BhswZQ!FUu7>a3WRon(!mheNz^H4xXf%kiff`)Updp|lY!b4eyck9#IJ}uJLVnTp`q5^&tL@e5>gDHwy0YTaKe`c=T zZ1AJLzxR2bmmgR5y5{4|nVBRNibZg~pQ zdAi9n(E9>;oItKCWk5&j%Gzr=r(h3e&n%@;^$je0nsBz#Crw#3x-4;ExLR&nxfhfP zjMp9q#!L-kX4%q5gnTmcAw5WE0ivm1T`{O|6bO+*aC@ya(X4hmaJw<0hU-^%R04Z5 zfr;}Gitjb_VaVEMN0L*qX7%b00-!-n*r@GLj~9OL2^{8`_Xkg4+(VwgUwJBcKemo_ z8ovj5x_E{%3SGr+a|$9S{2x3I`QH+9(m_s1!DxzscSK(U`P3@W9_WJypfvPmZ*a^q*! zzar>0uiN#iLvQK@PfSAFZ`#M`sIZik5bMrmi$RU%!T?dV8%u=9ZYSY!@koWbHLvO* z2fZP8JnzW9&V%jcGTz7vXDDAHL$$OuRIiRf-AV50yORgq^mgaLrF(@{tjz1cBIz1Z zl~0@z4lg-Zddk0{n@et6Wjp}K9kb{Z zJ&lvf?dxl(huU&iuKYl5kJpM5rinL(uhR-(bKuG$xN#YLw;bj2v3)@QFX}Cd=1V;M zy^%Itcz9!t9S>hi_IdUbiE36krESPcZa($M?$h2m@&cL0BF%N#PxO}^-k29JmVgQZ z`iCCgh>DARhWI?Z(Tl(-9=9$rhyhc|}erxK^l8TNaf z<=qVx~g4r@!66U`$FhsrSGB@GsafhkJ>vJI3+tVhgyn2{{7Ky zoB5L{_zR||q?2y6w^lqJ*}SE8Y^95e2khPGtL-BqoO`+nl4I#1t72o-F4m&o-B|Hx z#ny_)s&-ABjg1y&FWQE;$fHXN`3>5SuB;6&ydSLzx>VYYzb5>Ccf9b(9?21TwEg1# zA(_>x^s^ZLEQe8qT3I=7N31Miat0w{eVHzoKBw{6%3f`>5Tc}&bvd4mkmK z4fI<}f2l$~2jpKhG|+UeLx86cE?US82CLcLV;|FWOc1|;B|>mFiiCY%ZTQ+f-Fsf& z{oLR7AKo-2F>K#%qC!Hed-nH-q|^58x!(|MNE58@enYRJkfiBWU-~W#T~Y3h$)iIU z4q^BtA47yi zvHz<%So_$_c!N*{Uc|r?(XPPTjQCZCg>X9!ugul{sV?+OHL%Kh^)nKXHk>mq%a*=G zqm4MSPuHHYwafv+*!m~=qR!YlutvsKtr3i@mx)gOf*|L9(TtU6*>B=vv(Mf2wfB-+ zj#5dn+ay+i%UFhLvtfjVc*=Rg9G%YS*c-o&LMO3|!P`zkE)Ob4Rp%+%h^&&t=W!_a!9HCZm#Pn_9*;Ie!S)d^W&<^3E#N7g2 z%CX%fnoiZ3X-iMKX45h-e*w+c|%vCIaLc;!MXZGNg4^FQHU zP)K&~PaX~2@;UDPbb}-Je(vWd35Rp*@(+xb)i?u1Kk>%9-z|Tm$?D+YK z(e%euPja&-xy2)`L09Oer&R>7tceb^>9pe#Ut4*Wgt4rWqvr!((B(ab#^6ACV<`{W z^%5EBdh0FU@CX_L6lO$sz-sU_=stkGt8DpACzTHmmtK*w3Z(q^IG@xl`TOM2G5$M$ zLKypErCYP}X?}ELkUS(EpUEnm`9Kd@mtA&a;!`VIv?+o5 za$`S`cR_BfwAY}#HN=9ukaDtnZ}MoP|ITM90Q_sV>V18H9~vnHb;V`W!!GgVRwA83 zk8Jkzm$C0=vzXlCO>Xvz8?XM;{EuW}zej&oYMNyyAnVMK{Hc^blUj@EODdZK>DDYAvC|r=m;}pSTv!Fr^#-gXq#TP+EzT}`{ zv$ub^|DgeFBzU9Xv+VfSg_iVqoFPZ^{iiJJPaNKR`rhQ<3zNOYRAdH7o`mxpJP=@S z+*oFU{p~~ED45BgN{WrH7f=8$qhvK}Re@_?S-75xX}hem)djF5shyA*wfi5;{(S0| zBSa7)^xK3|ElRJZYEkMY9D>N88PNB?O*|ZekpZs|HmQMq-efbq0>>y5JOWFCsG7+l zQ@GdC{zCf{dPF>ml}WRYl|TBeR@hLv=?nD=B?y|O2C_>a3$vH8sXINnHB;}Yu7>Y% zG9(Q!oASz|2e9HLsY6c6qq0Acd_11?r&1C|v&+s##SMteT<^3K{;9DEnFZX%^ zpW|7`vxn!qn>>Lngg?Xc5YPQQ|KNF>$5l|^E-?S{3i1mIJixhy^eCJLg8Y7tX9bVT z^U?p@MCD0zzMY-{cQ|#6Coq1qCs5AsI`Tfo`>VW9&*^$ySZOl&aYf9m0!7B zD!#);n11ZWctsO8V%37t#FcEx-ELd}Q*B13VzIPH!N`Sh=5AE}zv6_G9X1 znb70nl`PCUe-wR-`SE6T<6q1H!#_T!cemOfUckU;R-(4Vz^0$n0#_@E%%x$)k{p9G6E)rU5OGBdnU^O zT9nUaFNRzOCP}p|RkCw?1^F+;4@#M6$G=mZDNnZ1J_b>+fi?=t?ucw2Db*)PlxZZG zwh5?IU;ISnuiwp-qF%W(x4*PAmQ~^X#Mm9-=lPM_!T;p9Ny@ZW>34h(@0H#>N;v40 z%EU)^>5DS5kZm6$>#dcwqtcT?aSvPXV&pa~bUXJheNEz1_k{mN*3QFAxEs~~sd#Al ziDmGWqfL@03b%BO7cCvvA7$=C_Wy*vrJ^UZf~>qF_t6u=mu#UWs* zb=iT?vUeBw*L5!{SdSK*D{4I~r8D2Q1{*~8%qboFdO}gN>(!I%s4hh_{pix~A5{8m zN?#9z2K7HkM=hq)X@jHzFye}h^>TZ-wgHE9-Z$R4ryZKt$FWTK$RzR1$ zCc7vG4l$#CHdK%d^w^!S^GPy^#4pGlut+}xk1YDy!H3>JpkzI?J;vVLIDCTWY zN55I%x;{14Wj&lNc4TX@`k~3lg}wV8@sZhn`;W4MuIhgK7YSsx*Y{0zMO~RfAMuzJ zqET42YaqqQffVmSSilf=k_)5SlZElGoD{%_pZds-|0tF`vQEy;^JjN9&mogXr^qRH z_&~YJq|lh<;9i$aVLb(S-C*jW<)YG;k4oQV^9cI~SsSh0{B6xw@5iJQ!Zft>1B7Pg zrxCQCP*|5IEJN2@Zxz88vznkm!A#u?+|F*@L2Y6?0<9dcXtrZtd=*h<3QA7)R{FUm zeZ94Yo@{kl7AC>^3M5c^R#j3GLre#2GrlUO!Nw=3^s)k%wS!c;8qwAv)L_Y6K6hrq zT5m%QGo&m6;i628C*R)NzTGK59yDcAq)WLd;lMjU2gO|ajmZRhfN&wCC1+Zvu@5m# z7$-2=S^xs?eO^;-R^i{+6MuzxeNtH_u7vG(s}8e#FB91(Pml*Osku+*-{9|>vV*lC za;#erB>z4j`_9@aJ0_<=&D^&qaM52)mk6IozB?{4D)JNu5GV5E3jW#uJ0htqJLo`f z^UM=$gT?t4%Exag$&Jp6$nVuM2>>Y1SfGDWJ#my$)eeB$b;I?RDlQgmzMUTv+4 z^KxrPw)H+s(r7EHjcUW^r28@vSVR00-S^)F(tRileNJDeMQ705*RzKU8jZ~j>hn_A zZvR6C#|Xg2FrS=Z_#Zl&xWw9<1y`z8&lJAEJ?BKo5|h4$V~A17kh)wK6XZ-^my|*) z?nzY4o@%grdz9C|Zma!Ny*;ewwSa%!#%ND}X`@vs%!*T*^=t`~n?jkKx$Jm5t>!^z z8n!8VR)zKI%k2d&$BL_r07j9F4X>;{ef3uR^`2$2_$pP)NvG+oEQii~1R6S9J4e%* z+!VmK>c9m@O=ak2uo=U*;p6(OSBZYIoGfvWv}ANEM(qUg8(Ukc^$Y{&z+a@#zAjw- zC=;dV8L;Fif{x@++)DCoa*cqyF0RwuwMlJWA|o7=6)Upw*K4SUn>BX*(d#kHmWO)~ zF->9s+@KRY<0QBcLvi*g{&mGGhGFB>E?!yhUJ-LUfmh|Nn3*TRsQXRNUokVkYOgUO zsqr5HyMBGD#su5bBbzcB)K@h~*_?B0mc@@VMVM|`UkxTI2I2$q>hXAbiic}u0}J`; z1!nTGwEBX~QAgczZ39=7=f*R&&md=VQ#G1bZ~dA^JtU2KSoX2;Jxx`+sz=zbv-T{D zk6Gzm_Up8NWcA~PY!*L zqv!A@<3Mi%Vw%kZ6pYVW`C!sz^F;` zbplDZzw-bvm%m?gE~1^zeF9(BR{)~^V<{^{WyTXGbr)+>lXRU;jk}4fp~AyNvtX$@ z#gtm@;QiihGLX1EZEPNDOfb->b`vhDVGr=j<)y?8joPQ6x`%Jc8dDo3C(a!Fog>&< zS+`{vhUz53Tx1y9q%p13vu1-;BLgd6_059XrSlBQFKYb?BkiTxLYLJCeoE!6pJyVQ zC@N2FA&$x#FwqQ{WdcTg4H_^B4dw?1O#gz`f=2Z2I`(ow&R*GPR0DF?y z*kD*p5JVUj+t-($q)!JRF#$9YVHfNl#o0eyC1VzINTS6k`oEcPM`ic62ZT^PG4*W| zF~Hko1jkVF5eXVP@n?xH{J$2{N1{~sGB15~UOFn>H?2&5bVeE3ls{m9LF>a$MN2LV z;3TGOj@En()$Q2!nYi4QfmgZdvsCvbkRXws?of5lFuF3>ksODRx7;OyfoB8k|| z9GyIVA~CAf*QAb+im^>95ueJ;-!i|qb8p+xR(GTNexG6fT){Ms@S4<}TvWoQ_zto) zsjKksz{jVTi+7aLWIF~P&y#%m{6!cB{9XG+m?y;j6((iw|7so^#MNS*^x9eU!|x1I zC^^K>Y;IKH2OW09os8qnO)8lAPMl`c5x?_G-LT>jWq$8mY{m%cnpL9!AheP=(|Vd9 zOBeffUF?tRWe5f3emsd{au73C=aFcEUZgJ*VSCRX7NJ@PI|J09w|4YrdKN|jP4*XL;6h6qveSaxM z^yB0zr%dL5)MI>)|4z{?LzcdHpO&T9@Kd!nHB8%!OSOoql`+dR#vmczqR4h5XMEg( zDkL)nKmv(#QnL`UJ45`hdV%0+Qcq}Sg`(2$F_0oXiDFdm*$WF?WUKzp9?&sl1T$E2 zzov?o)Yr;P5_pVU0e5t?m;gdjP@WhlsgrXor_bcF=`5M^HCXWvIg&^@h%8{xq`dY5 z&Xsf|$4if4a9T>2WQUw&iW^Yex(MhPTPzEiH%b6@=F1>c>cnN02F2EpNuJJo-V-RG z75zLDcrNA{PS_frAMtGB8N<`ha|Ur0PCD06{ZDk+J^AMSfBWBp!l6apT&P3zN3jVi z@dL!59b`oYmxzvmaagR}bTnm-#4dU~LT zvbxBchiC3aJ#)FUaF372dWcwj*Cs>)`pQ*VUyWwka`~z*WG-o;B_$-T844z7vMc2E z(ZTamYpbpPrOp35$nrOYD!3hN=?DanVtg-dl+o5#Mmf-jGw(i z&vDsVBWvAf03~T`{z?7C{49Ej3wkv#(A=d!tAz_&IR0}ji^8&ORL#0j1}k(8e&OW) zB3d@G6-DZ;48YSc1tT5+`biIu(wA@R?O9>&Qh8}}S*cRa64WaX=-I-fQ*3XNGBIf4 z@A#gKLoFQhukPYqFbjx1)S7QW4*f`4EOMKkFGAO2Q@Hojd z0@7X#S8R)hf#;SpLC=A?uo#JO{(T_c2685n-}Q?J_rEb$|9c^UGWGQuhsv@fAXV$D z3Ak$INB4V%5}f`Q`IWf>PiM)dUS0Jw-2uW~a0Dk}6MI_7_R7Kl!DGz+1|+U$bAQKu zKo>P$Z75W3<0LMcSm*I~+JuW`pR)kPI*Epi?7pQWwE)H=bKl%vl$SHFk=~o-Xi=1o z%28&`-lOp znuLv|7#$W;-}`B{2L6r*X?kZAbo|Weo_qL}Wn*%whxMVZPdsGB;V+gZoHlJmJnu@g zI5DD^Ud*^+y*09xniu2m#FW7_q5H3*C$f7{w%hD!zWixk`<6gt%T0L|Te^IuktgW9 zxBK%d4%yAYSpJTt26gt=3taA7ycI9dfBCN?F_jw%qK7Q~lkFa}{**hmz4w}0aj#66 z%X~y9Tt#fB28R0LXIdL`YH%B?x|->_2HNEd%PX-+?u{J7iv?F8*BWrlo_g&Cm2J#_ zvZ62YC>TH5HOU=0w#ZYllMXx>M`1RYzcbZ@897$5*$%Xy%XDEa!VuL+FS2aP*ynC9 zq#NA}v0^pg3s;8iCzy}$c?cwDK9cdD@gcAig^pIYFX*dkz>1J(!RPse_VU|H!rlYPmTF;Ozi>kXeWA zjs~c0!U(NkRKi*VZZY)*1C))2_*ZZkT@HT99B?wczmNkii=Ws%i>eWy2*0&C0G9wT zkOOcKesYN@rh0xNT?k?1;wQ@uFMRu$FeNcgdrN5Ii1?=?Z$YrbB9B6_Q$i^*CYy?S zVc@9|sb+B`E4Hw?(y>tl2De_K7gsU0(7Y_rD>KK93-#Ap{n|#X>~;i~=36S*{jT;9`DQKksf3bNB83EDNxl(Uc&IK_&}UYYuJCO{7J)efx`$+m|K zvVve7M(wB6m7YRr-V^#{h5BYf7Eb)kB?&#_N>)C@em_%ZvdZ_;zt z^Lmjxu)mV-RBaRVyvNcLvs2lv6&oxJG@9L&?5Ws*J3A@1Dq;ykTQVJNS*rC*h|$Ed z)LdS&rRX)Y&TAN6#`bUvmyy(!q)gr(5E+7Tn$}zvmz(AsvyCUJe`sp}pR)4#Z9Z9G zBSz`JTc{I}-qKJ^{YVrB^tlqNEbQZ&IQ8;%NUpC4$_^*TwU3@4*2`8*#Q;Zp1-0P6 zv}$kG4x+|X)_N?deR3|x6TD>@CJ|S?p>wvTMVsVZ!3iiByffh<{tl!@V$nS{ z%Y&1;R5K3ee5q+Z03qyfGM6D*4~qUqu%UHWqugRD_edqrrWGQ+{#E#o6jiiA&kI7 zyyw(&{(O|=nvoq%jNsh#RDI^gGW0C`!Ty)DhHN%f@hw7KQTMkZ1W=}*xUb!L6pjN!ydjH}k5 zT5};vh*^6EXJa!_M+DR@L{Kp?X5bNH1|u)h4a%;6L2s%Wv2JRy2Rky-AgNo$R#fUX zU+PkG-Ij%cPuPvK)gIKJ_An$2T!o4BEWJRx;qD4p~j$@3=BkV>!&0V*7+Ro_m-C5CF@mDnNjQri6RGgZaJm8UYmA6R+ zj=_}Y`^iGLUDz_$S+uY?1^d}>^WbtFGZ3NIqevYb0~T!;+9SCwCT5Uq&x%;rP3g!J zONKX!1IT$RJzc?-Qky4IquUP7O%|mWv>;hL$$ud9u01@9qL!W?XjrE&geJjH>u1Td zrk;ey435_N04PLXZ0E6VzR14HgO5G-K+X2V_~~-k-wrZYfy{DGmv1?(fYo)jo=L%J0ta7P3}dC8~1TGxR)UCp|O|K zl(dsckMy4XQ|Goef5f|_gn5TxU&^!6q{)nJ`OV;iZ#pi0p21WK(ZxKR&WbACbUl?Y z8+-L^oQ0n#G)oe@CaWmx0M#cY;&&&idf;Qu8Y^CHbLtTDwEjo_Hch$t+gOxzkCmE3 zyNNTit?~Q?PHQ}6Ud$L0i$kel_DFk{Cx2J|F1ZX@KOctD%*F;W5%vhM{*9c^CzHQ3 zk_NxO&iao4aJ|ncy+&Au#~{H7df6yjG9>3ehM@(@sxOr1HG{AE$K_$+-DLM zwF_H4QSPuvTa!0Pi#Y8K9Y0NoS2|^;2Niss682fzpgOLRy_Q(A_-#d<2hCb%j0j!m zK9$4WuNx}OrKo{;k%xaUJ~N&#M+!3W;`XyOA7L~nCq3xu@;r!e%3Gg)iZvs8Qjv?> zUY@HBo-L4l<=MJBvF})FUi83r^b_N?n4+9`yKm9?F+1P(tOxIr{rMtqU5Gl{s};J_ zX}c|n*U{aI-0r(+_X4}5UOi4sqw3S~UPP(R`LMmjmwdy$xF)tn?hj~i;|xFR+zUh; zY_L(Z1CTHWUW`*Li({smh68b3%5JjX+PeS&xI5ig#~h8tU<^?ld-4i3>!MG2BSh$tD8D-@^U)k|LXG)^UTsldx6;}xaHP+dDj(g zq-l0x{$qGoS<&1z>Fz#6B>c1eo!gKvqPF3SpO2WhY8U2pd?=`$Y8S~OQ|@Bmz%q3W znltug$v#F8JnUI}W-v0d^rp|-3j%hb6=O)}@3odOw{-=7C}3f@7o5iwx1;JHL>PG{ z;Y-%db90s$)OYRcSOMQ$Vn5b3>6;Z>(X9LxBEV$bSa)h>X=*_LNyFEIcqGhPaxpE+ z-X2pW_OPzn@S27OY2~nWkj;hmrmAIx^2(O&h9SX%7iC1ip@9sUarm6Xix2l zBdIwaTA%)5D&|NR?*TjMq*7byvt0Mg>eTtP<02uENGy1Bk-b?y#h@39RC>Xlw5BuN zRkkKR&OLL^#IJi3r@Lp0WAlJLQq!5-Q5G?V2G_;>SBqEGwwupxO)|HpLxy@SjCMx>7?JYej&{Bn1 z-Z_$!`cSHz>1gJT{iR!UTee=S_MelxUJ13{Y9eY>9}zH1)+>dwT(NYEdo-)9>b8fa zCV7+HtU7Dj-Uht*$0=BUeN!=pU-UepzeC47e0#Mzt9B+E)^21SAF`?T>QwurRC`UT zy*AZ8J=H!V)gDc?&rY?^Nwv?@24qTE_-IW>F_D9aNY46bh(XMoM$Sk?M- zhYTd0rYxqoVs{9ar5$3jAe2YG7CbuHn^Pt!bjSrRi2zDWUr4xti zW7ZlPpi#a17+~a9MIdsE@1`B%6Dl*BGv|4Av*F(mgw_;U?5o-<7du4!v1ptfu-~xr zH2e{R;ENv^z~=8sZuE$GfafH=bWFXQ&;Kyvp*vLKU3NK z-(axD)MK3|jopt)q#O!&U9^QAxbRAlw|JLfiQT}GCw|)I2c#n!T9wI@e0yb*6hZ)DHJ4<`O(6~_M_7N$ z0yq`5;VC*MU=J7M?iJkZp@KcVO`z0C2Kx*UD80Abgpaj{kL3-G`TQrAznkX#f!Oi) zR+`vqd-!;H;{uUrfTlFGwoBK)f8=jVj~uAj*>h}&V`Skg-I6zdt4Y#VAWbJB{pYgr zm))yaX7e1lnnljN5;s{QmlUI1QJ5Mk0mj6_>pjQvGiDon%ksD7Z?m7R*eUMg{6Fr= z-|8MJmC`jAWqs2woSv#_qohsb>JzukzK_bNrc3{7F{|8Uzs}-({o@SDBd_$lhI3Un zl?h^^!G4FkY9c>n53qR&QVCf0*r?9m8bmHpD>A?82KC?E(dfG8Qn%hFV3MrsTS6_w zh1<{O{#vidPdiD|NdEDflA+m&Ay)^oNfoD29A}`Ac4~Mb93x5teou`U-@5xQ2x8i)6%SMc~$BB9(F1J zNFEHH$Efyq`e}Dc56lOCDC*#YCSl70h)7f?Gfg=}y$1o(lvUkbKMPC0af88AUb#Z3 z2L)!&dGdXJ<(e^kSFSk63FY)>hG%T$nsari&{nb=Bk;kto_z(S(D%Lq88y3iV)$dv z;Y|g%`JS&0&oD!&KX2de&b@QNLwmB;qd~efZt#GWR3no4>@3+TPlB)Rg^QXyGH=b) zJXPPG;*vF+?q#}%2Kz@g`siCoJ0PDLFMPd52E+8u!w{&J=PVuJ9Q076D5Ce0MKo@k zXtN-$0t9)K3Xg zKRk`_#W~@{_sLLKokS)#jZaP%W@0?HrY;bsktk7nhB7QKkO+JDJpN*3;&B#qtW7?w zb=`YjPk8t3ksF%*V`#0clie3y+p}%oaNQBwib}z4h31oq=8_HL>1%wP!R1WruDwQI zU56QV(1D7zk&s2jJBb&xu5!FMb%Ed_-RCeIVKufM%#5#cd$^2M-e568JiJxf!-X_> z8*kVSZ?G6)HujlMKtT5Aa@dpMY#1^1UPPriROFvOqYS+vrtfD5bAJ^H$JT zHN!RS!e*n%qs46{j}#M%v4dd0xHbsdM=Sd9^UFPT_3W)?xHA}jg_^1!?lm&p$2O=x zp?k~Fl&hqS#OiwW-vl%hSJT*_e#pChqT>BzUok5O*88g+UQpT|UN6N}^a(pyq_Z&8 z9d>X%-|WWweXYgB&e2~S#8Ak1DFiE7vrSmlw)L!aT?6{fD`)#EEANs*WJCQ9gZnT` zfMDdwB}0h1WW{ORAmW#X$&isx#D17dO}$@mW> z$#aris*}j5?_uEk{HyeSwk;fW`M-4|^Dr#-i;J^uesR>{e$`H!*O^X$D>!XFfdK1Z zcAUuc_CIbkrt6C;yw`w_y-kuSj!@^1=!&Tkte_my{LUw@%v1xfDch}T| zNb+P&B>M2@sQ)~VuN})@qC3;ekMTF0@Q+FR!TIQQi2_wMhUgEdPjO#PlXI-u_#)I6 zD6LV@L}nFGpgwmhjAXW7Oy@fb1##TqU)z&OQfR-c#*;{v3F*WP>r>h6(vG8vvBqSB zgf$fj#5^Ec;%XxU#$ipbog$DbQxgO+he5%Wt{B4Dnjl=saG~e*%1GOnx*Z~=;4-T^ z3k{Z@(lt{*(BO>Y!>aUw7N(|bWAf5u|1WFUV_$bhH1+> z%as_3e0YJ}43=29_E56eFVF8~WK9>xO;IhN6iMi_hOa$5y}-5Sb><65BHCJ6uWT~f z^L;QkH0ytB-9yilFYD0@c2VQ+NKqDJQtS`$-MP2Dc=>T{z3=U|f(`N#mHY0?NY(0= z8^$84L)#L)PuNdwdnJ6h)|5Yq^1C{8Qjmy6l{i_!qAQyi5NQ8N#S5K#mwq3jt3l)^ zPLv?{HcN_VP;2xu$47131Zmp999WbBQz|X(xPB5*>e*?zEmuttE%*EIbY7ZeK8seR zW5O7D@Cq%BWc_5I;`;J~7zh3}6>74UF+ymP{Zgq5jMF>sBZ85%$MUqi={Dd#{}Ebs zdaQo=8xp8~!fHfDL-*3`wU@@23}9&_{K|>yO0gJm>`X6xs9(~^5s{0l$hzWi16}c` z`ma(UK_3G*=$aot-JD#~3{o*Vy_DK6-y{{6>)^Hg(l&BlNZfmM**HyRoR3!>R$Brd zPDO>0+GotBUWfwLQ~&f+nJrC~xcV9g3(PwDs@N!}0ev@*;@V%Fg`E1#Eixq{B)Msk z5eKV<8fwC4J*Z)^2$c(liJ}b;@XZ}HK-LcS9wtBw0eV3O=)OfNAJ&dw6G(b=jb9e zR3go{Zl8PQo9*pqC_m4mZ%D>ZkEt=d%c8nl14|5#sVjg^i24;4S9BmpSrepy>{dv_ zGxC1n2l4Zp)#}%DCh)`8#7?)s7pR95n7e<=#Azv0rWQzz_nP3;WP#n1nvliUl#{{t zvoZAz4UhdO_$GMI!FPI0eaFC2$8qwk@$KwJD$M}}$mFGWWJ){@d$%U#Ky&pKNTJej zP8ItHHuyQ^zX{RnEAW*64(~bTqe^j_Q~vF_O#3{;drtcR|7~UJGxsF;Ld*jV^l|XN zkpn;R0r=l>;2(cuF#e)imIMFf1HOCrBQJ=m30U&e_;Ojxgfx~hQywLfrOhUOr+DFL|ke3NT{i-S4EalHUqZ;g@%$T|?p!vSG z0y@dxaTji4pr^#+{P`{>h{G@bu9(fSRvPTtm9+bJ|x!`g6 z%DuxJ5H#*}QdP$;5Wg$H zoa$}i*Wx*ZvQ8d|k2nz00*XYjrC(hPa53U`yDwFdgp zI-O!9vJ%YXa`kwQ_Ne<$Twn?)rGR|}*OEup zsU1!s`2W%RqyvSpsX>oG3Xvv&zNLkd4~O@IL0)30a(VPv?tGJPYc}B0!-Y_61TOxL z=OwU)K%s+5`K6u4^B!{EYjs=J&=gYlaC!&vV-140OwP0bSvZ|mbp|uiP9p7$EDpuI z39S~~R88y77V8yrf_$fUkZgs~P1Z%zX zUdj9Y&ih#2?{?nj@V>%%hyJX^&iicME$1DcXw7lnX-R9k^G*wEinRP4e_?k7MOH(R zzca7pyvluaLdD<5J?51?bjP>N>vUf4Ft0Osz1_Ul@Vd~vVq3Q3OXhVfub<~thD!s# z5Tai%aOI}{6qBaXWuGDQ3C%NG7C7+|d^%ee<0eS|A=&04Hcqq zq{C#-er>&)a)co}8_UudBc|i9N1M(aVvRXi{ z)p;}-m~2s{wEd3&;N;SQCU{^JVUCQw(gst5EV6Tm5IBT1!6W~ za2-uJTSc}dm5!1w5`b^?UpHGbEZ;j=tnWGI=E76 z!xFChZu~%{dM0KoMaz;vcipP6kXgM-I>qJWU6@ni!}RKno!zmxC%r>_!cT{4nBaxu zs8Tw2WB&Coh-p>W zS0MAU=+ahg*Si!|LCTyN)Rgo}wJ;=5^iikDa!wro(quU`PAn!cXb)Y;0^a}74i3j- z_Mv+%zA83WJVE`!vRrOPG&p%NfjFXkw_IMt(GCca!_FR>h) z2`4*(`OR!>aWm0xN4`PU>RyYm+ud&SiZeC&3WaC8ZrAHxTI!c3=H_rS5E2B^07@Szpe{QLN?~ zkeN+Jrb3sURNwI?Stk0U>sw+H>MGk_E>WTO;cQC9@wC2$=rm4&df~(|VR5BgvrO(s zc&H`(PHZ8{^BagyZYs~IZw7&r@ms4?euDnE!6eM$=N^n-XHMe`QI`(j_xBgT@6Mdq zV(>fj6XW-<_jNC4(EsT6d(0%v;&)Q}-IasE5cMMxJMH(B;CFXUtl-zKf#tTJ)=ywh zf4*EP8e<6$$Pgnc>5zzePUm48w^Uqe@NbX+LY8p&e;6USiku5x2Rybm`@eV@)rA@s6Z(hL{8?8{3T z{bTFXJCd8mLO&TbDT9CE$KZdJLF?b+fA&fELrH`2|3?mXL)2Tx2jTyn=fVG#oD|Yu zPe_`N#Xn~5cV+p|J>FfZUuOk^Y z^GJ&L*E&A~MXZ0ROHFjIHEvMwxddAm<^&BAvo5w9in;2Ql!W zU5h@l49>pcx?1?vrLNT1-b<7>u^}gcZpgSFyZX(d{pi~=?JQR+YEl*gx z#}I#CT@9&RNvt%#;Z8i;vf#iki5?gdTo;y+^l60M*j(%F*pHOu-+F-?-D#w zJ;FiFKAlO%pHFgVT}R)V56g$ZJU8FmfzrhO--nO7weNmH{&Is!=!`l~`b9^u0|MbyMi2tul!jrg0wt$bqKmJMKUu_a*`mi+p(x3)1D~v4{ zehmNnq$Rz0L{}Mp<}+iyN0mZ9UA{0Jkb8)lcfk))Mi)brC`$2T%CGyF@>d$LnTGgi z{`-ZT^3jC!Eq_r?(*%hZec(~DRkv|hFr4y*xkRNUohPH?*wf z-5z=bv9vTzviudntYi!8TfCLZSuz5@U5qOlCuDj`!Vu<2bT+DBfzxpM*K{M$JvJUt zsBhIkrK`5Cf9!_x-yC_-?y1 zyWnH$|IR0^ze#9!gx3I*suidWZ!sU}wh)r24~zZM^seQbB!NM|l>b@EZ$!`O3}Ftj z=ES8Zt=<+H&?f$47OOK&I#rh~*FH+i`Z(9Z^hFtE>$P0uZGYzqxT5thwzhiCv2-*1 zjY&Wf_#$t|XK~@?M;+jq`q2vhcHOaw41bgrXlhP(s#FwS4{!y>8ONa*%P=$X9knkn zi^;U@#VP>jLRV$3_pZP8N`GMP@=a1yZ{)am-W%t{F}Yy_lQa8 z;8}h$zr>{at(?cB1pAOwmZO(~4bZB~?s!P17v`0V4|hByb$7?>qUx)%K&eH43_YSg zlY}S{g{RC{YL!lm&Le9bt!tQCt056DP$YsofJ6pJDn$_QL`c;Qe>kTCdcab``JT-3 zu6~0^2-IXIL;ENfNa>^F{tn4M5f!MW6=#VyWcv+tcA0H?=pB6du+WN6w>J+ywaZ8L z*&ebk0dm*PLEZUXb#4r@ebLOb)VLa=ndugPlE0oy(;zvZIIu>U+#TVf0D|T~+xJ@Y z@i$4+(b4nSkIGPOR@dldgeMcQeY-kcG;dc32}M>&3+wB=_8NIj&RFAdch#=(ec8slmFqnHpzzuk$U(J4=_#2)B~$)`EdVQ zikYbYG7b%TI=eZ#EZ{}_R z6PHbl<1Q~^&CVpV=CFKHzh{+h{p4a-z^V)v1k?oWeKB~SY!X#9TR6Rmq%ZUALzeiY z%#?us2k;p=&U!Lt-J26DCp!^}p0@;-%%cKbjx6nvDN`ew<-4rPjN)6(Q*rvix!GnG0gs($~Z-j>7VN7+NA*2w#``ZPOr`2;-n zsdK;=tKYssv*?xO^isrgK|LX3Tv)D@j?rQuPj;J=ZI4VfPu`_n2e41Z|1t>!a@rQ# zAV2XD4j!ybT28xh9DaPin1Z6oa`CbBM!* zF3xhHPqAEbcuOt|(kw}HA*Kpgknkg!G`7O1ocAno$b8`;UL6h>xY(1aUyI0Dyu(z(_w*Jt*uFISVr2uJG%J``$B`?BU<*GQh$^t zO#M+>mpxc!AD+Qs{SMNrMU+2qQn#HTY$83N4_-viWg4`Gty^M_ZX0+d!QXPHZ9DSIsS!v8oUYtyO7JY`xP>1v1uqV%BFWh=b zH2qhmN4TN4YxcO~k&TOrx@yNA-{QJNu1Ro-@`R`DIfT1%1SQ*C)O4CYEowT_w%MJL zX>q;()T@+h*)~IgUQ5KgC{Ep^=i-x1kTt9C)0`}C?$jgUPU%Kt3J2Arh3@6An9(pZ z`NW|*d)`B}sfQ$8cJAK1YR=Q=%wO5cL$x4%Ihylxe2Z%IF*;hdoaEau^j#w zd^gX}#kUng{IK@=KY}j;ZmuSprDLKB3K`VSX+2ecWIGGqG=&J=F@x3T76+~Ivlcja z1|^oJ(QzpDn00B&E7s-*s=Hm?4om*P`s`#rY1giB`~#}1KQ?`1?A8L!Sw&33h0l2_ zYUAVNl1>nXr?9y>p*`Ges9-))bpnSxa8 zk@wT;?AjA)^}u)dbMe<;^|N%B?EK z$c>sXgT$f9{JDBQf1bUD*q&dJxa{}5-LjXkT?x_+eTdJ}N{{Qn75tI;Fn9_jymChF zd=wxE6O6wPhj`JBx+Kk~{>}ubm=j9nytY&{uY+>bUKUkHj_a94j(Pu!&ej~3G$F3h z`#9N$L}W*Fn5=nR^%P2hLHVMDi?<#zJl|w(k_l&Rcszt*iAVYd<^HZd7Mw%~@?4oh zIPcAwKboUm9pNysoS_4R16C$8!6;;4s%te`40V6!SD2ygRpBx!!i>R$5vIn=H%a9O z#*Pf4^)*yLJzG}bQZHV|MK!>2+*Zg9?psqxptTkMNR7H;^Q5dYYXusY_3Fa4 z(hk?J#$eC~aZWissR91PgU zUO$#r%O626KJPvWR#OSk3G}=v#|ie(YY}lHu5D)Ui|&svr9)Kl1`tQN*b|v7DVBT* zc!gwd<;o>}z)erXDASE|&@Q-iHMr z^(V=Me-xCRbOCKYhHH53p@JuxQa|{MZc45}bA>jZhv{cT1H9#9GniM{yS!@qxS#87 zjTxM#;FQ9vYV<-UC>oyGWtCjT@oCOr7gppaET@&4;}_bOM%9@VCN=GA59tW*;hZkz zUyYFzOf`uO3Is25Jlrc`b>1~A1DBkVDC^i2KXql)eM!AL!BwQZWKUkluEal#n(pb{ z$=%v&o9-v4Ji);06#Cz^!%2nyf*@{%V=+L)cs_e8#!sqxSfz?({3|!=^x43{{Vyw0 zRX3Xc_gt;}AF*gaWFq2CQJk)6*Cd{LmfK6ASMI&|)I+@#cSu_JaQqqv!}vwb(jvYA z#ABZVm3t$BM1Z`s zDmZvS%#+@azX5H}>yA+zy4M;pkVf01MSFt1Jyhytt*I^u)RQr&Mnl%gjQJdGk0c9U zEL_EG%wziQO4fMvU1TX4n+f$|Yg`PwTRs3RVQN(hDhDR76<-;0rMwShdJ;SnMM1jg_g@@GOnaD zLEHCWvlxPqo59`)c(fg8nF|14gBp22cMDxnI#3hSC(;Zoi_Wlzx`bS|wRs}mgrA0? zR~yu?-Al&rLREfP2M2<;S!pE(EvOy~dx@h>^$xr6uv_#7z<}ECYdCpm*XKk}okt zF}0wk8h@4MLZB{z2;axZ2%=kkFnvt*Eq}$ejJ_1RjL$*=v>Q1t(pDeFv!kfw=2Y@{ z@zS%z1C9n^vO&aU>gSmZi6_N4w=Nvha0^=WTTYFg`X(->rpxGxoSJ?cqJh8bntq9> z!8K(j$cLP@TAN{#w8zUr7e3H@S;i%7lpn9XlS@R@g!2yS7fWHS$F#o02BHnv5>)R9 zfjS)H$_&S-)EwivhctVFhn|(;p?@Vv3|W7WVJvwihhg+;+DI;*=Ze1$5Rgb02h+QfZNUgl-1X2GW*wk#=mZ2#gW8RY;H04b72{RxFs7rE;snvY_NDf$)>(i z2fHf{#V_kTthxWvYO!q2z{T!W{9pDEgaF=*e-%Avo}M#j`UmDrxnBj(ZDGzN^X0;u z)?rVIS-wZh%XHqqk@s0=zI|#SF9S#Ncq^u0l9V?6C+)b5cKHj>n>^B{n(a^bI7Zdv z&~SP%b5@m&C$z@v*7T>@8a7u5z^(+QTd+!1VsEWi_n{pQImFbTSm*NM@TGgb@CJ~c zVFfOO4Q3eNg!SA+mnf@Jg4Gzl?V&oLhJbn%lz`z9fWDs|L1lQb^oV3lERD%GM?@6BSlBEn{^F{xag~_JQ+^spH;q8r zrRykmrUcRx$u9@r!po38naNq;tPg=N_r3J`B|N!=1HfC(fgXZgzMABu$M0T-R5wv% zjRy1nE4w^3U7pQr2xG&-3S3$rO0T6A19Ftfy1^$p%wC|lm?wN{iNOefMMAsevMRET z@FnaSd(~C1nMPoq3$dQk_cs&S? z{AdI3M z_WNAmGCOW)yC)1c=r63*>XWR%PVh!q|Z&Uhi+0X8c z4{cOGHD~GeQOp)F88@nX*B}>Gf8Hky2C*OBPe4!F6$n~j!KENR0|F84^m=ve3BhOZ z5`4X=rK!8nJ06hldkNC={Zd{yr543v){14^qHWU4%Zo1;KwJg&uRax0w$Hc@F*w_b zQd9<5`vm)k_7^$wbIJ~G@wmmV1~M2fWMq`b{2hOVsdUjB{&gd`%i+mHB)B*_E+M9X z`d^kSq_=SO)4#6HO#qiknCWObJUq^n0LSoLcj666d5wKyjep(91}9abh;4m!QR1J= zE_1~%*ir3;5XFN2m`@hY)}P)2|3)SD4mt%i~` zt9zhbn$#E!A?uZ_|69eZ-VohL+ezy?0{`nuM1CWUebRg>#yHdnVreNKN8phsW$tUC zOM9_oM-z8;kV4Phk-qpCnpe!IcUXYC)n{jwu{0u5p0~-x{>B zFLHhH0KIS}MwZ64GJLemGpfzD$Q=v0`oih{VNelMy#9`V%3E7_wyQZYH>TtqO3&%Y zj%PHhZ$RKOm^=)ol4i9LNgN;Cpgb5aX^b_g-(I5Ic<_y4nzv$O#+hb%2*=9UFtIUu zS?8mv!eVC%?py{kAt==)D|7#9x%J;a#GHQ;P=ytw{zAw8Yi&5Z673f^F22j$WDO_0 z9ee#N{A58oaV8F2lP@i8s8^rvcwbsxR;hpca>4p(dSn zFPg>b^E7o))BEhP8Q7l4j8Ri-da>&uhL5;5{mP8*iPhuxj^iB zwderiJh|!-Li0bF&hF%II=A!ipF!0XAJxi;zjOe}t1?KICf|tmpJogMy=p(#gGt1v zZrHUu{}}B&9Ed?z`>AcO0Rd!OAC{ z2koQr2`t%=!L=7}nd%xRFkW}Z8k^Kx)w=s4C))8hlOc|NZ~hwn}KcTXIjja~oViX|AwPjIjJlj!=U&jyuM z-oQUopSr?qeY_uDAE?pPr{a^>=fQ2%M@*TPQXTn#zx^MtkCtaIDxllpw^-M@G3-m6 z)1-nj{Ir7O&?a@Uo>*mK!V%GJoG%i?NjhtZCb?*-?o2Y;5n+qr2L!3z#5KlR3!8}= zi>jcdNB(ZTrf5``JZ;t#r7(~}F{FxE83(dr$D*7Wow0&^ZmnB5PNgg<>Qy=58yO8OMxBda9C1ba<7Z?PjmKaJivuHqHu8*Lc%1c4FvhX>^bGp`PPuT_q`s_YI_i^H zN(s@Z+VahT3V2|aHyh-?{;iXdU-DEI`S@QmXqOqZ!|Ge#(P)Pa+TQ@EpgqZ;U8@#i zc0|xtv;b(^NBT>ms)F-KJq^Uvj-!Z!h`*nEx(orm64U~c0rE5c=X_NMBkyZxX{;2d z1>K1PX#jjIpGi*pP~@G&>8-P@YS}vu#aFji-L+2&35w_o7jn~ljT|mWbW}aCOK|Z; zHmB-f+y6=PU|2cwczl@M>=U!g&*ck4z`(Pyxs0y{FV2^~=CP-FBAesYgV|&2{H{4} z4Y*M?0vLbhaQA~Gk4G>G-q_HjRyy#CAf`np<^J+O?%@V4rjx?N<*i>gbrHYgUiIkn zx-M|@Ax-Ls^oO)w#yM`6`Hra$^D@_|vcHkK40FnE4$e(JIy4mvqC-Zr<+LvH3+%PB z6OnB>#{v~IWiP_Pfb2z>bQ=QySN0+z==q4f$i34Kiv5DbE=@I1@Mz0~d}lBBIaUxU z*=fURMN5LT)nSm4)57j8l%jkeHsR<4sykI^$WyF<%7=pHkr4W>Lmn&*4a>G(=vw0I|ne|oV{r2Jhbyta$k7V50FzMp2(va;TJB_EuOVX^NR<4lj z%eI}i?A^C9Q2U0P_@yt|ePfv7jP}=iHSr?tx%YFuk@p*8{?%HkNAD+!{p+-iVE?+$ z>w^Bi)W7Zr0#A$~&f}u&y3rJl6BZpd5WAnSWlp+|ZL$SiJiDWNag^O=Xj$UQj=hVg z%E~{#=fy(tYF=2vR*hYVygg?3aM^N2U0Qyq1kksdoQV?j5Kr5@O1RWww%B; z3&qL8ysUFC3kaFU918b$yw1Cp=;DDe+CI{H8dhhClSu1f-qiXnn&;U?c+1eUTPV+eHYL>ziWQz9Fv^U6y~yO^t}VA;vCf)4RF2eaa8PmkC7jQ?5T6?Ycz)# zU$sjv+n3u@=dr7Mi#{lY2-1krLM-Hhg1Eoqm#l*#k0!)#-FW{x7lglTy%6AA7^RS? zx8!ujzxo#5&G=yzQXchpeU$){M_LeA<89e__}4usx$P~_G)C(@0| zuBkFq7V14MLxp&~^&~3Tc9p%O;;(L6y=qr~kuJQdJ2KU?1k@7aD6=%h#~93Vjm@nA zmGQ6o7GqDJCiE9EUJ(g&Lj;u&O(^vlA%_+$%2P&oLF$@0sit}JS&Rg8c%u*q(Kx0{ zxyAha6fX`KPm0HBN{GH`4XDc><;X1KiP$s-F3ifq^NF`1Q6QpL1{P5cVNRlOH5k{~zt6IGq$#)c6EJ zE4jGV701bioc}(iS0SlO?WMKs^+#BbN?B6xW_9&8&1}SDMWH>Nt95coQxqJ~+#r>! z|9{Hmy!);0Ocu?k4m2>7bo;{E@FgXGrv%gcjsFh2kaLn6+*w%FLiev^vZ@z)3}>V7 zaO*LJd(G(`=mHAm>Md0fq4i#Dlo#SLj!Fz8UYh>!ELm~-B(@gG0t;5S;Jca&$|^Lc zPc=W+{W34Pn9ccU$^KWJUD~QdDk+y~sH9HyS=~&P+R^;^tsLk4Dx3CndxU*?E$5by zb|=K4n{vBpE{=jgk8SD$Khhloi4}^gn>sHInR^3aF#Sa#Kx!)x?=#Y@9Mm;GlUVW? zo9@lg`k4A9gFsf@pQ6Q+n*t}*SNJJTmi-+&Y2@T(FpaIeu=)kP^P;NjhZ#~UvkHX$ zXktI7^=lB>*?Nr@M9d^!UE_2~VWbG1j0HYvhvZDX$Y;>)jj3ONgZ6mR>`CF12Zvxd zYoFy4&py&dG$zGOfHn*8quM{h(&locDD)r9WaiLUEz5Q~P<-ixj+*|14p6y@mo%G8 zP0Y>A&$ZzoVP)vE)Qk0gpS~q0!p8A*i7W_0QBfFUG>tMn zN7N`OAgbj>Drxp?EZONKu?Ojia@pgngF-=B(_x$y<4SVn0c{y|D%$YN1&N(yQ#+ckfG0`6> zmuXC|!H9=1{>Jg?i!TMO^X9ha01N|!)l`0!xKDi(fH$m`=5#b@0a&elRyPL`EuvH) z=`JmOW$B3#hHFfTL?=O{!SXMG+*9Mm|EXOTAS<#U)yfdPSG+|eq!MzkliZRv(7eE3 zmE?K=BCas!h0rEB=|}NCk<6S60k)XSSa@znu!Z7Z=sy0-;%~U~OM=V?q&HA_1*ao~ zQQ55f81F;t(idkbdpyyb1*&q}L&+H>hi3{zV@fHr@Mm`hxV?!fg! zjdg;BIccOn^Nhwqf~|w#l8eITSv{TGwwsG4$Ol7;ox#cyumV-+!A9TUh}JTvFMicp zIP^*Q%%E?cg?gJKneALu{n}y=Hi)N|2oE9*7~q0#&2jw^=|s<9<_iEam>C2n5-rPE zd;tCSHu~*8O0V2DeB3o8Sfg>tQpr>gt2^~H@QK;nz=(OH-Sxjo*PGH^Z++V8dd&i@ z=JCgljwHhi*^}@3T7#MUC31z>ZxR|+o@BfP`vOuRgbGfLwwi&@=YfB2TtWBCMN(YG zd+f;4_Ob<1*6bh2eWg6Hej&F_TJ_2$=?kPXq^zJLmg6kV7(9I_rMuUT8j=4}qmVB{ z7%P_A(XjKucqY{oeJwJ&fPD3wc3JXSr*J^yx%Fjo>M{+#)K3d2{Xg=gi9uuJ#Z*1& zcTZ`IuqQk7N+>r{+Fn~ZW;0Ptk4a8HbD`Fsd)D08&8bgmSNt?KSEZY(zYv;t$%Qx# zFV-Bv-1ari%wM?NH%?^3R=G+Fp-B(hWoL}#8M+HgJRIW`lp`(%P`up70%UZuZw z=(`&1PB9TJyx3LR^bNEl&51JIv}2Q2)DhmqESpb~N7nHGOTg$h=^u8KlFDLw&02X! zTVgM+m;6+(UTMbl^;en@Y--l?i7_h>DsaUHESo>4J0&o-Et{q%i_V%szLtHU+@~?j zI2x{G@k;b}4z7I8R|BoCVJBry9Hlc2PiLx6W$M_d=a^(-;#BnfqaD({iLUPWu~xui zJvSRt<$j+oXR&hquYhhA?4IP6Lq4uio5>0!db^Mk2@8e;B(s=MB44*WhOGun2tmg4 zi?!xj>6hMNR)yL0@9U1hGDMS)5F-1YEuBM4-;24KDn*Q-+=x&lpSkROJo+(q6e7T) zBs-$?8&CZ(vY6b?=BfAbBq`e|!~GgyloB$<7#ZptRjJ1PBqdagLVVVp6yY^`GZ=jN zMT-Ghci5XlD^&EiIyW%^--``HmaSCFbxJ|$3y7|qp*lLB)}m`?E{Zs0)Tsf08gJak z7hQQsJ#4K+q6C~DA7RMMvB-6jZgW;vn~hh`H@VMrNaKuIjaSdvb)I)(Y+_Xv+`&m# zEDl~`{DCSu^MyF40vGD@=5GV?&LSt+24Q zsp9Iu8a-jdDvwD4idn8)k9gyY!|ETCnd4jg@Q$j^bKBp5r90R#VF3o8SHmFx^fxD* zm~UPd#(xN3d?Q`yqgJJ*-^6@jwStVSHD1)tAABLR!5dafbQ%}tB+Cdezrjit&IpDJ z%z?Wmc>}Q_=8(!r$UM)NTB<$uvw(rim9A#FTEH>Iyu@eD#;`H>GCgPD)ZKf&m*0-{u6o?BdAzkXw22|EZzwE;Ui89g`j(VA3(DH{sf1M_V=FiacB1Vc!_4;+2`Zb z*OR~3dAj2e`8)1GNi7Z8|8}}1!U26-#!?alzmofUMdBrUZUi2o&=-KrtUXjs0(wG+8 zW0sUg3{iE|4r?W5CzM(}iR&Nb^j{sV1y!Ud&BpXnba45%KTnm{))zpG>j8z|(_p6x z1H)m;-`%S`w^{1)Kkr>$@B?Gazu$|kQd{(rkRcD2mbgI|%F3_6}YikVl^h26*7SYhc~kQpyp_dtQFk@BxT*KMNM} zm3Zj9|i-EVRwGN)f#7nG|N$YWR&2tdp=*?ejL!6WIwvUSpz%*6%#HZP=2wf?i7{!I=V zAT7qQE-~*2N?3?W`XGF-ikZR9C*nCH$-MdblMQ0EX}FOu3Xlqr|4TSj8jDWGSK~9* z!Em@Z?J<7Tsy}FMllaEVhgI_7ChNlu)&~x-j#c~mmNcAVL*3%co^bW1i^ z5@~)LsT7qfc3Ivr6SQ-`Xyv9&I95+3YbE;=!PV42iNpct^^>_sho<~YLGl$LAJ`BJ zywfCYY)IWqF~+M%(q>B9#E`l{w-DsuJN`Uf2ghhVMrwJfv=!?SIb=r)VKL-7n{g=K ze9q-VM8{1RyW@XDtUsQ7!^K{T-=S+1^yB3IUw%i^uGV2zpSN?AfsO;7NoHs!Q{QE|1HkNcGS6qE`-IeC9~ z?gtEZ?ruU12d;k)vesNIwXe3>m99TIEhJlGUosSsDrEG9arXSNZj6*EJV=%k813_qPhAeV&=aA?bE}?W zBDed)+>Z&I<_C!n`#dS?{oFa)lpnTDSuo`#2&^S_PEvkyS9P55MLW)^oMlv^x|E|CE zw(vOg{}sR3|M0>237%E{ug3eX2c^tm=D*6uS99Tq+4v6idav*GzJ+5I-R|ejM9YIQ2&qVL1NrsK98= zoVm-^Nv&;Wz5WX8;Id@3nH-Fsa1w0%pZN8D;r>25g82!^$Ej(MDz1rI_*j8Ch2z2{ z!r}ebgGS-8; z=)PVO^?HCjk+~k|VsC8CS`S*y3k!B_Il84hu{Ka~g0#4Na`0&Lyoo7{E|)ZWabPtN zspGVe`l^J*VRG?T+3&Jwh=NBpJY3PB zCJfWFU|Fk1VWPbtqDD&6_4AX@$uJ|5JQ)CcUq5*0^Yz~KeSU0aeaT1x@ros>Y<`}m znnXKiTq?Wln?O7C7-N#5hu0-uDZ?!u)gX=POq*MIW z?!|~+anWH9~Gqt-`T?zPJkIN%mab8Z`TM$}ZDh4V3O6KPf9ELVYeh)YS1k&cUgnS!Iup^bgephtB5I`7p_aewgjl`2+%J z)T<(gafO2pRms z*tEQHuOUO4C2!dLrPur;Kx2A~+EF8g>?x?}>(KHhj; zgkkk{rsOf%dS6^%R?SD6a8=~42WMMu%w|sSW(Z*d-y!7Z%>F#tkkOy!!q2kiYjddA zdws9>=3eig_j(U>X4S_qSnH8Uy9gY_8$Crzt+Fy!VsQ| z_Z%`+mVcrZLFfm)XV)>r@jlJ$WKdrux+e0xL_c$|(N*O6$y&6~%eJp3$y}S#ZzQ_T zis$PMHzk(vIFZk7XGWZ4;XPW5sVc5%^O2M+Qg^ zQGyswmcA$CT@;baY(4eAq{^^5<^^n~u^s2k(#vt}LYgrCm}*Q7_=Q%%iE+3c=B848 zmuq^(ve;YtWo!r<9NRC!hXU^XH??lkIyh1RWWbdF&09F=4T;K@z%N+ie_<5>ZxAke z%4lv_o%b=h+wV?n?~}W>wJR4o3Td}RQTPUl>hywEOjg@1q~1^-)|PamO=buRsKJhFOGa6dkX)r^=F^|HM>8})!Fl}`SD)wAN6|of1W*GGvvqB zCuwxcWGz>fn1908^*CkdXqrO@l}BC^-z`_iPE2>0|6*?rOLKK>-N3sZUJ*BC_c4PM zID5wUHQ#mk`aeJdv*Ik?XAkLzj;gcdv^I@$%D!VzRZT#$bQd+ zXH{Qhhb(;G?iM1=!uR8cFTc8RUw3m?_IG>#|GLX^71GvC{xQ2s4{(O!julp^r{973 zg~jdWz7I8f)l!)R-jws&(gWgTr6&m~iF5N~--%Wk6L+$%M59-*u6+J0y{>Q{=6#y@ zSk$nVl+t*ugw(Sg;-442G*5NSs}!$(#vVg(CA#Nu1UJC)mB}dQ$R`(LLr0@df68q{T_0kUU67+SQVOd)d4v;VqQ0wu-2(vuVt>6qo`ye&`guXWkLhtRTc)P z3yYs7g5hL+js^dXjV508+o{ScBg&y`Ci-9eNKl3e6?KeaRop=B-1yu^ZFBHzyj`0z z${CGiMT^3$up**1zb{<|6E$lis)6eVx zrN?KMj8B-#dgPgzGA;{cR16svLq;VAR(v7LoL+s3c{0ynZ$9S5WZ5V=4>P^Q3H6L096Mc1)>~X`&#F74KQLy=6uCNjB~#?Z zhc(jELp&2KeEf=FVHO5JL5BaN=t8T2p$pt~hyqWf3S6XB8|9Iz3UdfBkChN?AiNsE z$U>)Tw6kgqHfwy8k<<$x3j`GlOw6`G1`$tMMp^#HR)2JTnfOkvPOkOwXL;tXV8>%7k`UH zS3Z`#Q{7m2&(mwe*rDhpx?&_!^Lg%hdVwEK;@Nkhg^N!Ks~kV9jQgZxM`7uUzcnE^ zAi$9N)p-Y?KiSOoQ||*Ywvh8U1Nv~tH(IE?QYyCMArSqo_i>`OzruL&OhSbKlG~hQ zi53kXS>U+M3oO~gHS~ZD3KuK5IsA5Ylz)Dp8v!$;b3D?22|GehJRqi^VY4~OTRot$ z+}ox*68o%I37vmXVs9*d3~eWtxUrE>EWyM8lXahLC+NMSZP{Lp1ut1bYUFoQyk>i^ z%4lDx%H9uyU=1aq12mgdK7pC&9t#;_UDFvczva*5T>ij^@$F@4l9k@Q{IYR2186Ll+3Q!=+=WXA26OJxwee$& ziRmvA9uoWa2lTvVOrMlNZ}bxXtTE(n4EY+TrH@<%Uj>PC@(ES+U+MC-(Hkkh?S8ww z*fj$5q-{)?GB?Xo22^(WSZug;d7D6HETg&T5~{ejR~7FMKG3TQU4Gd)LXNQ!`W6x0 zIpcP!u&mYc)vR8%%;MUJ6d-o{g|vTv3Vx$b+P{JJhxIBsthA@3g-_NatkTMAgRu#T zmc5Ctvu`LCXUe8LFXn5j_-W3kvbN?z`8UyZEuKPMv6$DId=hZ3SwL@Vj>&iINiL_z z5BR%{zZ(7=xf%bZUz{0l}ft4Avl@6_TMkS2PV0!(=ZQII&Kf#+qgkO-|fN3*#fW$8tF z{CbS$|geeKOstPku7$`{0bj)fYS8HX|3t+z-#%Xm?1h zS|M8%xk>Q^#^f|bQI&tjsW0OMOv- zzvZinpX+%d$bn!P-2wyxH@a?$Xj7$0f0NPh^^AoeP}i4uwL4W|vsIx%h0cFhq4y9K zHXC0IOfMePukL9Vqiq%-VTK}oG)@XMBGHulni-7V=7ZVvW{N%UM(dQIy(~a>knXmA zeDb5K$m)>hC-`ST@3Y$o${j-ucXa?WwK6Sw$Ib-=Ja*WsuKlMBmRsfoL1R3)y!4L{ zCZ>3UpwS)0KsH2AGSYouA9ITeXN zHb7eR?y_pynW#nVB7i_me+f+UBpA{yM%4TNIM5wYeyc@p_~F{BHtlPZZqRB^xFyI* zUevv8kK8m9(SD_#+r(iNxANeRWC2LJ_|a4T0@I5PA@gxPBnA%=hq>E7ATOhD+1rLW zUZ|{4@9!1}xx-$2kANBCOo-c2A%Xtc56^Dnt`GgItNl9!R>-9YJt7;`n@>2s2LJ6`Hz$BZ=Tv}eRR8J!$eYRGF<3|1!biouDRoNOeugac( z(U`GQM6Nmg*e1`ry+@k>gk392Fmsy7bcp zG~zEc%FzyYl^4(Lt$?^HQRC-v4Uf2?m=_11!oJ#3ys08tUvep{BQ0F`l|`LQ!rCIU zDu~e|^#|17cgk#FHTN{!K=JW-vDElI^;hydrrTLlkf`xF%(*zIoWtl4!A7-O1s)YU z58Pa=2=g7M@g`Y4_2Puu@NV)sY1jM`I5o@k-2MxoZJHv{wI=k7U!Z4lUz@FVjx%2= zeyv<0&Jp`*Mm30LM&9+jURhYDM$zR$2Y&N3fPFB-pk_a#(QkeO5&GC{=@_WK>U%p& zlebIDrF-ytd9(PfHbLaw*ot1>yl4vUQIL<6b8PU5p~a;`CY!89rv?2 z<7Jk-$R~pTDT#~VBjW1N;twj5?$PB{YSc5@FEapDLAr7ch>%XriH+92yYtw}Uy0``* zlB_>X#)yUNGP=#oBs1V8x^g`${zm?gMYH9}aCL>6p!?=-%(us|^IQVScvd9I*Br(z zYxkEDJZE_B+T?_Z5h#vY`=*L?4vuh%(u`_qDy&fVKc#5_)5k#W2j)2q-FD||M!>A# zBa!6v{A$jmex*Ajr;`^r%Us1>Amn`pJmARUU7nSHN3B7}bbv@=g(YvbJGJ~tJ(e== zjWxvgm8hOos-Em1vZsK(K#4q3AZ(jaUmQqIL8-Pts}myT9?xxT!;nYn{P*Y$Y1jX- zAr+BfhQD!!cr^veE85GnPTD*_$n2V@XP*{7E@Q8!S*bWkOI9gJuJQ`RN^`cn5{^U{8RKN7{s_WQziE)uBQEA-9Cq8*L&-A27yN@Y z2@H7UZaFY)o$KoG6LKQO_Pp^%-@L|a16i8`+UqU9BwDCU?32tH0o`P|y8AZT4CA4) zRZ9rm-4bB<53}>I`QM-PoMFp1-k?WjmG6a#L;xEB~Er={63_-Ra(y+sG`+F2azm%vcK>pao z3zJ1(43zxsR^FI3uPcj4MDQ4IUWDLLu9lK!3mqo8!pVDA^OFptVTWwhDc05mmTfbe z&JhvrDYG(_`CwL`v!zI^^ARHj21n0`_`~W1h*qDZgAqYQuu_c%NwPfYzT|!&<3>K# zqe47%cp`r09Q;>Sj%V5L90be4NrSszie-PDPqGNawq2MyFWliW2ERTy%jT%UX3jxBrQ>)XMW$Dl7yz z#Ju_!NtXk=R(@>+AzDDU&&xlxB7w35Mnd7_t*gnxnhvo&g}@FPMis-v!CXVPU?9cI zizUF$6nOa^r%DOv;9Y^#Uj8PgfOuPgVENPHgI%_^zDm8%5rH(x6wo}aO1(^q^(NPz zRjFs}9Ks7p$Gz(#au&DFZsSMx%qhg#zxIkQ$0$DY24V2pgz0G+YR_#o{J`IX_i6s_ z;KyWPw@yJadXXxrQ(9AAj{JSrt$ zK!!M#Z;H+*Yn9|PhZWD22(T-M9wO_}*;$2a$Jkklm+6-lM@Ph7p?AOerDd-8M>x>J{Bdt>9G;3iiAB_LqMl$9|MXE796n{^#gh)r6HWFpFnxk6H$FW*27{k zc02!K@<-767wfg8P&s8HMM~PA?1hZDsulsTb;mjfukeXv0eRu#tF;1v_=T#GNe({35qdsRoWs zRY*VHB#%}4@fvwN>ov)+KpwBrkKdI?@y`#b8S*$%r=Bm5bM>Q~U#s&u*bb?ac{G0Z zCd+9~9cuNKE;hbT-j$WsENKstrdFX>38}rD(I(bSH12vgRq6@Jk&se7X^%_VHBzdH zkSq9yQ%XIrAD`sWSoKb-^dpjUij?k2TPS6xp-vt<^`pcORW154Ds^u8OA4L!QhwK+))@69*GcjRBxhueN!m-KsW-O> zDgsjJul3`R^7y!Z>?e;6`mvjHeB+TfQcW$C@}|_;leR$8Zm^s0NuDLi^Ru%~m$d29 z{HJ%Bv&P99&?X@)*>Q!{o8AZeg%IUacPsVM(8&dbkhavjIDjtnky0M^CTquq8 zq!mh9f$mvAtqSBiI$mN0$l#aCd`oI=kXkqC$D8CaPmkv{(!gWy(Hp1Ce#agvd-{&7 zw0}qg50j=w=pqxO^qH94gw(0>Sg2EFe2nHTsfv^ox=t$kWjf6P*{Hds$r$A83U<;< zqeRF_H(y9zH9<=Cq-~X&in7zTNSco{HC$KoDAlNcXgKbb8n zCTRl4a~dOtRM4g$FOx^VuB$>GkJXP;d9?XEauN0vddCvW7fX@ut(d*^aPidlB36|{ zexFQvJ075)cz~=A5>I1N>P&=p@mJy$WTviEf1fxj-GH6nx_pUo*6*C<^qpo|1yWXD z-M9Po<8+EuzTkMO)ph7d?Aj4LCQ>iHkPdSZ(FDBL`-~vtkHw8!$Y3V79k51Goj;ts zj4)Md1Thcv;XvsDj2*;kL%wuWA_PrAKv z(%vGgy^j{@_QK+iR;jKyU(RQda1N3;r9WY_WZ8iS5$$S=Vv~|(`_8_P|eldVy!@;#1A=O?i#&7zPo2`%Ld52QV+x!mWH+|gQ`&iyS{?6&0{vW(M{=XDX zwUc9Z_XSQbe>waK>>6&D%jM+n|F{3;IGp@HH#bF?_HXl&ud>b~xlTrQbH*%a)A)y| z7%q$-O2yz0*_s78W>{VF=aX-{mS!Lyv#K>es1HGQG)ZA*tQ&5+{#63BTFihQ%XYJ zNA91m0~whYyGCB@XrIC!MQ#saotTJ$<*)~24Vc{4K84ZO3e{=a>n7h$x7I7JoDC2H zSGmkh5pzRphrjhR@A4TX%fqLJlHsxDhKgj3zqO+vvV6vA%ge^7Cm#W!`CxB)NeQON zPsyv??%~X5^Tq+N9_rMFt$7;lsw?i#9N)=|?{tn6rQN0)ZV@X32{Xnt%{|o&6Vs8# zJ}l_Jg&O7e?c{VnE{2|4KBJ0FM^@UAC!Itk5izYno-U;cTjZb7+x-39rF5=Rs!+r zb<`Ay66pdM&^$T!nosE}^*?W?bZG9`;@BWJ$n^v$u<-TCFSNcFLod(mqV>$c6y(Ag z?Xe_U*cz;#1Y3RO2_WQNj0cIzhJ;Zm$7I+?)1n+=pp4Y`I|Z@pq?Ah1!rNbfEv=7~ zOXIaFP;$pNn*)g`K7-)PMe)Av`9chYVz!5+UevmnT%$rs`o=BeMskPa`aaLgPjQzX z6hyzD&>iPFX8uUjk`fikeYSiTz2tSkIugSqVAW?xo|PAYEdhEAKv$`&wrFIDDi);* zc&bvDk`yhdQX|Nq$0DAK{&*g$Ecs3@jn5QTg?xIQA6;Wvv)u3hs9tyx^hPgaQO z#u{&9nU5Yf){KJSvrdPO`l~d|v5qaO>XH7sbBjjpX8S~_c6(>L#vWSbX(OAVb{8=VHUc@GZATsqrd1dY~?~d64 zDY+BlS2PyLTEtgy^&>TLtiZ)KFFrWR@)#UzR5$e}Zp~vaAL#BJ5E5^Z zXegwPWgh{Nvp$rR8;=NJIqL336cz&t)y?_>jWk&xr(33iDv-4`y`2?YYSxy|F zJT#*!zQUf2RO5|@jD4WGL+&Xxr{WIiB7V4mCW-FjuTZ;gwVR9g(*dtjWa3U`MeBCNS&nn$nn2? z{f>llsp4)O|clUxha5Ww~(|=@lItp(Eoe|09?AC_b^L=V&Qc(iWx$JxV?W~#vUJGywo)x9 z)m0|Ca$^0AyCgkHdXz7h@+In&GvtuY<4v6FjrVKM2W*G=TIZ3pF^ce~iL<=%W83p{ zCG`SVVw}_?rqdl$sE6Q7onwthg6tv#CR|Ejy!M$EqBJH2%45mr%bN^u|Cz~pJ02fq$VzaG+Lyl4g4b~Hw~xCJY!HA zrxZdNFOY1Zdr`+@JgcgY_RGYW;^*VW^v6jZ67WK8`4T@%Jb7?|48{i7**L2ovJEwvue^oSAt{y>S8dlq>RS!gLupXjH6`CMp zP|(prsfhZ+CjzpoL#W&k;V6?n9=ulbh;gu(3UwDX*;NdniYm2RJSlX<$7f-EG;&5xEJ_1Z2H*1O>r4yP3~|F+SD?zi z<8)Y8WyTj78xOAOlWTOhBI?;IWXsNd!F0u*>AxDGeGibhpktBs?zR%dBtEPre6Fbi zBYv#BnbX9#Jxl6BFOK6P|58|m{p2wLc_Gl*y z0<0+$F#ei`baATB6D&wO=EyEPS8SASdyJWn^U9{@Ijz0OooIEH8;<+(*>o=&n`$*+ zY)w~{M&DOg>rQtJqN*y@28d=Qw?Yd;#AC>1y?_itqKk6CGS1drlA+@sNKn*BcKyN+ATi8mRtRu4V%p3cpqaISv%jLzJPd{l}mtBl|U5$8W}at zbOXk|bZu!=oNCv01+|4E76Vj;r)%spU;62Yw;eaqJ9TTSt$s!x*y>n7VmLy0ZoAYc zV^gI9hTN%Zk$f6c?N?ct>ML*`{Sk0qK#h7 z6oib`nnvC{RYpd(8x31Qn-1OH`CJNB=&Cy-b~% zJds2h3i?wNAr3t=wEdu_q*cS7MW4yv-=0JM<+s@_oe%#A zei1QmW(~s5Rl4L5Jb3DlU_Fbd9|WLPW(nbHS&nE$EcV7ZxU-lk^v;obM(WjEoxKbg zk;1<9`c#{3T2g&sa2kGjGpW$TpcBUVsvyo4cU#jI_lW5WWF!LDhMiL zZ|Bnv%Pqa$>!dssD0xDOR=nX}B?lN0uh!jLv<{c=>3H|zxrAdcbX#F%zXUfII+u}M z&c_a)|C*NnEPw66^@r8Q(}7ynokHuv8GHMAEtBMfA82Ij%Vx0K0$O(Yjrr=~puHAx zS;NBgLNqBVWqwVWuxg-ECYF>`M}4IEiZzQ8OPE4^45AS^IyXQO`h2b3>0-dm!ORzo z$AmB8m|Q8&o2Obk*y9aI+9v1gbu*K7GsCQAxJsRNh%M9I*}u|!U;T8Ku7yQ!QCRKO ztG-L;Nt}bmj6J(G#ew!@1P|eG!VmS-m$e44wA8R@Qofh_f;kScIQa2KT^b6jv(H^2 zoxMx9;MXmP%j1PE>lWbED_oAZzc8Ke6$Z@<njJ%ouWO?;o`H{*ON+dw;puJ1Beq;|9toi})Bw@BM#1Uy6$9 zmbK%bk4B=y6nT9CXQ_Cl?dlwcYDC~n9O#Z8VZN5U*4Z?OSQ7P{y*;lN*O zaUK9JTPLvM3lF`q!JZt{MueRMh@W_zP>M@dGK^gFCBCmCLX)FNDS{}vJ5S)!2kAhf zyE}fA`GQ<7|4Wz%jyeS#xrtfBi5iy;%&XD24OpijV%VEY#g*!t`*XDt zX^9jffX4s|QBl2C?uo`{Y`N-78aAAA+dwP1P`BJ*RUHhgXDQE^6X=e6U0h(%_z9iT z_*AclG*!VLbR(04n9xthm{R38autOdF-eO0tSe!*GCK{?h*(AMOcniRq86vn34P5I ztydRs0@Jc3oO{YUxqPn_06(Y}h?26{f#=~C~=C*xPN zrAB9d&Cy>AebE5`jex0eSJ@8xk`iOk}S}VcrMo-jbx60S(WVMA)#>7|ha3YO5 z^u0vt1)V$4_Hr|e7yduDX3o#8B$@TWo&0d>`dCm-Nc6QPU8I23ph%!WXg|R6PwArj zh|BeamTH7qceCa9$NM%u6Wq_&&f^G7E)U(@Qrn(=BY9)J{vygsxwfw}AO9Z8CJy*& z@}Bci#%wcRGT&%b95;GfKP!kzAZ!2f>A|Cx&kP>Dd`|EfH9_zIurA6A`IR6aPP-R) z?g;uxV)@}*iS&u(>Z@Pu>yEmhp>aY((?e>jB*?6ii7pdlR)zW-X<_Dv6z1T%6vR;b zblx~O<@ThS%MvYeBaqjg-+YwL>1wv}P#*P}uUBvi`M@6lOue#N0*n>nDm;vK{w7^| zq4*W^K$Fi|q9ZbW>5P9ZhdT*mRA>D6!0RtwpJ;RDexVmVzo!AG5+UngNbLkR$nqc5 z0-iHhgR%ypO&QAcLAp(&cKoaQp7FIVsvRe5?l?Lk)<~1Z0lEe4K2al=r1A)>2olc3h-+oE#^!Dp=Qy=~d`RX;YN@q6_u%9sLOVBu#@pS%Qui_DN&_UWAy`5+!=tQ+W-hlNzpF?v9`HEfWvE!A}N=8k81Mwlbh@g`h(&=QTVvmYRt zoKl;Gfu$YdL(Yl)I2Rie6jXM44eE2oZApQNYc-KhTaG5z%%Dt%KzWr8N?S?DHq`|) z0Dsj`!Z<)@bSKLlZb)r&e+2DK56)z;&Yvlmm>5?71N;D=zGIM*5+|(f7He#c*V64@ z7Zp0VX^w#Hi>PfUI9V2E>*56z@1cv^Qf2S!RrVapQa@`PcQ0x#Jjc$OV!$EEZwVUD7~NG=QpktF_l34U_rE8DMwAX3y=S?1e)YrfVXHQ~{{EI#2zB zXpnckk8q6>1#TqqD;Qck_zjI_N!2_{pn;`guuQxv3?VJ<(KxRKiqHSm+J?ETn6R3 zCpo8V6W!1rN|cZ@f^)#>(!Pm(MV^Gz)6kuCH^xqsR&rmI|6%fQV^57Ct0^DfXMwK5 zm*AV+T`c@Uid3kdZ{(1P7`vP*;`Xtl6)Mpi=S ztpp$Rm!k4t)mT&>t+q%t0VJAKFQ27JwFes|y(|3SMO|SQG0(QE(WS@S#Nw@uRL^GCIFctw-vlh%+^mI(I7X1q{Q?XcN9}790 z#afiGoJoWq%%UxI=h94mFjLG)=4*4>g-AmSVFNLtYT@UJTCc-XF9Dbzp&H09`@5w8j8r&*%<#Y(aUPp$^o;Me3X2Glk*9+0A1SO;*u7|u|YFQ}! zj>E;;R0&=QuXchB9^2>Oa8}q=zjP$g@4ADN#V| zf-?JDXLBlxS7)(Y+sNaTUjNDZh?%i)YPJ4mmH^9zO`N_)!Q;G*t{}uv2>+E6lVH*p ztYB71v_G$K_yJPxxf`TQg&9JakOG?DaBP4XcW{K1FD=Fgs=pxBX{}W5+{@$~&08sp zG@y#+qcC>F_!{@ps5PyQvS4EoYmetOgG7fhCWXq7y68fBKEsDRfuMk)PJFC^adryP zTHpcK|D36D&4E_l_&63!VfBDk$ha(fo;H&kIbpWb={FVSe$cQ(%w|QgopOwfUxbkBsYC9C`@@|=?Aw%XcfKRXhXY~axL6jUK`lL$kgi!bDPKbmgcRdsSK=6YHZlJ)LEbxOikib99zIQotiCvZJ%)5igHIgqf%+M0Nvd zzq*ax=1ZHm2g0Hb_AwrFFPqn6I;*=a{sTfmgqZ4fF74BNmozFDII`G*q!JV&-e|6h zgB9T_E=Y1IU;Sp0XU!C?!iL7>j;L*2{aekq5*rGLGa`uC>m*QC&0;++#$yaoL~WW1 zYl3eP*&%*z^CVibHUaWAWC*uo0B^3aC~sHnNE-^*_!1$&^8f(=gn!_+8mX#OucFmq z7>nH9o3~PHU~*}9?w5ij#ARsv9I?Z2UyxdKyi_LILxj%*K%!_Qcx% zRo^A(GuKzY))eXZy_;AZC<^v1`pCi7VVY zlb1M4U#}+S2tKY2%V|>%qkhM)hAw`j(Z;jJOu1T9CQ!ONk2FMLvJ#Oje*wavep7K2 zG{UlT5L`tk8Gj}l$eK~Ek!9lqP19?|2ou~}Su?Oa_XUy2AHPAvbvu;}<#= zf$?J=JkPy|V3O!4DQ)wt{0j+$gsIz0E|I$G_LA#)ooh3>O4|_MlG88T^S#b?#niec^5xj}e(&o9N6+>Hs=LuYSz!mS{OLCg4 z^rhNaV|H0ER?n#0GrsnMrkUfMY4`xD`b+?-JWPY(ebUO0I}~(jgN~w#|L!&eQQc>7ua9y67;Iz|GUbuc zp{mRYyTCL92P7MELs*hfO? zK6TIeJxn8LNT_T>f0<-F%`*zgAheG7t__?z9>XKwpcjR}l4rBfo$ zS^Zy(1``~PVs1Bu+;w{|Ma%nQ=jgh{|Qr!CD*tX*I(@|C{1v;d)xl`Ys-(@#%b{p?v&oF2c%@(Eb3?VI_@#iv_poA}hvv*rTM+vVem za)GjRgJ*@H|NevK{{YVliJT$xKmXs&|C7nc{PL^}@{pci zGXKRIJ2n6NNG_TG2N-jv95j$I|FM0L`M*`qe^I>g;`+PHe^F5A`QOKy|8*0_of1Do zm-eg_YcFexv-Mu_OWtIndrRAD-A&WS$rh<@Ps!5G(oI&Jq5pt)%pS8#=C3fml5fvG z_S@_u0O;R>eY|YhU*%t$%|Aq_{kQyM(qZ_=jr+k@Z~h@Q9-e>Px+s%>_*MQlER%=j z9~&?z5Mku7{9`+f8UB5mf6P8NlYeL>nEo=!c#>T3kA4>(hJU<1@v!`Z3!XF!S=PF+ z4_j+vzs)_amf#&J?r{(GAA)}fCNlWP1i;LY|5*>y`$t2*$rkd@m=m&1lWcs~=jrx0 z<%Z-ycDe?gu0BB;hWnB#>#LPl{gCq%ke1G>tn>gTW6lJh@UF; zeRdvH3o62dg?pGc9xoHy|6cOAj2Ac%OCj8wT+2RTF?KB5F8`MPJvM+?ce^}yw9HLT zc67I4AAH$fJ*EQx?kyrvaa_zg>>ab~w0A|*q%CtJgo*dm3;Q!Y!01}`u~bJq{(kMq z`8+y0&qp|2lLNwiNPb-bb#7$2b*k-$+^ZScwi%MzQINec9yS^+sKrlUC49 zk<126bXKHhCDrbb#_fvJ(i7`<0nn@bg<^jSeTe*?Z=Qm@eJqy!wOyc02?^~$P{EX@ z08coV?BS@)kF+Yd4r-Y_8F41vrN$CQy8<)@)Q4wjkscYEeOml1BNsI3&q(jkolK-v zQ#9vclRb!LUE|T9R;k&vNsHD#TUvxv``WE`&e@e)=c$)9M^dPZf{Gi0dnL2mKvZ!{O|!cBI41Xu*p(~yc$O1ZCb79Y z$J)bQm>SuTAxw~g{qy$Eq@s`*O=E?1;~nwAoEpXk(jue` z(1p+s?zIuM^}qET@yqcoAWd#*z5^YL-F^rp@&*rr2GvpF73PfZE2KJV_Nk5MhWd%KHVj|p4L6s5xB0~ zfkv>Ud&yCi`g_wHmuz5{7m5uH7`pL`*^L8boaT;sS+gk>wOi;}PdH(LZ@w7MnMX)` z*Rs9RT>L0~j$m>%hO737uz9Tr6CT+^aJ-Te`xFU!UK`=gH`g3NAcDeyty>Fduzy?W z#_FB3Su%v(%4HwgUaR5Va3nquhA{(OEa)x6}Z#)-GKnEn;D0j5$ zv0-wa#dQgzV~96r#XMXD5$l)eIyaW5$p(F7o?iC^f_S1~*KD~r#0MaA;n&SWctG_! zn4hf9LXxt`;PmM#jOhsd!~`_kPe3D8cVphP#D@J7v3#9@{sZk@AX!dqhq?()NBqdT zn^4Jk>dq1+BXU-=2xT?0)d#Vv0%%Ct* zawO_&93*e7To|{C&{u$uqX>1vnn9B4?zw0yF*n4a@H#XZx!l@oAUKJ zMTy=Iu*5An3JEN%7L!aPq3*x(Z|)X8-1sT;t0Yp%-L7REU(x7TA<`FNpgvFiyU;g* zUc`baQpp-n5_O8kd7O$ua0%>=s)OS=X^E39tnzi`2$eaW72lJBlQ99j$yf!MhbdI3 zKF;gzmTh`&3)3BYgVTC88GWKlJMLmY!ehGCb7Ug}{>i0D%f1T$a9+k)FcNNb?^D0g z8Kf69F{;?LkLvfiSddjhe{q*~Rf`NCq+C&>vzP_hXjz(%vuhM1HoU3TY^#Y-W%rTO zF7Ibw`73}%)O>-8wW^RqB?1`6PcVK6T)G#q3$ch`zV<)cny;6oaIUKzvqR;iVIQBo z*_GB04mGFlmrjUufARNNl7_Mxm4rp>+g_kvaY=37QdRvXgCQ=i5^tW1(92bT%n?;R zW-n%D*YhvmiopB4%jW8#7IdxDr3GChY#gZ-I!O>jC>f`^O1}zL-tWN*Pw8r!N6{^H z#(x1A3KSyBq2J~zIm`nw2i<}QF&QeGhG=uK*a>p_!MZa>h3Tug1-111mR*V94-^S! z0Y$3RLXp-yC)SN>OS(>l3PwpF1v(*z3q>MUj1@@(W3n!&kDk?w=vU}jUM2)IJvgfr zti=MxbLlboeyV}ntOhzTmlxq}W+`F|IkkdVgJPs|US{X~JCz7Y$cmEmjiyNkW zP^5q%`sP%bk#-qrIMH=nygz*}el7P^`d=hv_i|b_YVqaZWqPOVEsMZhA%_=zWzqE9 z+tPV7p*+M>(m^BuzL&_z%KRpgMToA;c}=MMO_^;7GMLb;aSFynoSZHYa-=-!x(BIt zA}KkIegsOi%6NziGL3iA2)Q-|^7Usi9vm-VSwbxJkU9|!uh8+ku~Y3@T;u&j;+-4} zQKOF**I9I8X~L!2N;N1)fUpk?BuSV~vy0Z$kolIrfoPoZJl1?Gc&nGo1|!{XL@!FT z^fMj-jrjYHhEQ4S#5lMxda+K`zQ_aA=JA>;urrbJV5l$@!9*h1{e}>PxJvRC=mxiP z_d$J$EZTk)#qH!yvp*Z2Tjyzd1%0W248)Tae&`NUR{veGMBFLzLOj zDCbSo&!&7X1;yaX&qkFI4yc>ZY@0hl6(e|n?vRVMIR!)WSiwg=?K4xxh|8p#xqk-U ztLB!{_c?XAPe!Lj&j&8A8=&4DXLVa&^P5;VwoScA)0|8fzmVwCG*LUn{HFK-+#u;X zhmkqycH8m9Q;+Ek-XCHrJS~#@Dx$=7p`IegUFfgVG?AW1=_C9#nZ!wKWzsqx_=dg~9KmB&k_nZfD$#$k>!rOW24 z#jlj^shL!KAorW3?;JwFOwsPXLhw^$=|&;JVA09-aLEgPXm_&a%;K)xotzJDmG-1% zj;rpmE-bPz+!@pkwVi_vImxim-sv&qfJ49Od$9C4RGz8Fp;B!$rFtQAWL6Dc4|S#X zw6N!swX&u9|{gabsRo-$NEOp zY`ZyVh$3y){(1czT|Yi%2i1R1R{h6`m7Qi6G9*+_m=!!)L+URN%TRh#t^Bje>Xh9| zPmj1S6ww9$fIFd3CME}x@!^)|t43iTeRu$!j=?|9nh>I6#+e99u4q_&4#fe0P(xuk z9_|wuUYVckG?k`qnapf&FDKvJAD_|QQPJtv(DdQz?E&gV?NTUHPan*uTDrw*NdiX% zfIwQ~z5&E8X|75)7Ze3h1~Z^p3!m4|mifqPRfz2SZeIn2=#r zdy=)l3mY3wq&G>0JH-HMtOZnx9~KCM@`b9HHic3NRTs&fuvZaa04$ZRkDYCu|1tN9 zbGH=l3@6>g(NtZmzq?D<$3KavmSVkXbGN-v8>EIh#3m%{R}cOuShV=<%iO2O zpC|z-dOIq5p@r%`cnC25V-87ax2(#hv=R2uU#dehq$myhNL~Lgf80}lVYJq+-)OZu ze#N1i7~ZQ121`@dZaqg+O;{bV|F!r3-#y&^zaI@QB|NsR3VLOvMpd-j=n~q>Q|=;3 zV4-3&nZ5b{PBd&~nuI6#0QJYyQdnWS$QQr}i zvr4hwzb}=JbgFGQIsZIWBih>UA8P^BYrlWn!+Pu8nE$Qz_uqXebASKGbc_FuqZ#YJ zcBAs8_V*gMdVhc3uMV}pXC6XIwQ{;|sS!MDh@-w_5L3>V*j8(8J{$YZZEJeHZu{1{ zy)E%`^{(qR#;j?ovuRV^_LjQ6b)JUrp>|Dd8{WDtKe6@P{u`Fkk&2*rLW1>u3Zz5A`GFZeGmwXa@fP}4BN^D|&vCT|v^;!9HS#jkFf znkTr6e?Nt{?Lg>k-HvSpcpGLzr6C9GZwIr(wHSR3{xRLG*_wL9*h=7@*NnVEYWfyf z_z9}R!lxvI2om~GWHGwSSk7{%);MY<2imD^$X{(|3(YJ(9vx!!PV)H7O|75h*KHqO zx3ML7uDfpepyiXCnpDZj;4U7M*qd9uo}59+>8{)EsoS`9`5?R4x#)1}HrDl&6bh7* z0mtIWXfCT)Q1W!id_>*$K6M*+S|zFGT#79(cT)avRS7LgRp8>giM>z|!gDv(l}Q1A z-S*tNja^oC)SX@3x2j(#0bMFaGas=mQE@~n9#*%V9__a(rj_i9|936P(4?d&>pb&} z3ca6UAwcX2h6qT7pdqpke?I;K>Mz=u)HUYa(ht~XO^CVpcVg*oE`Y-PIZ^AnHa>`} z8Ol}lBbvh#3Zk=Ed-`Fcf?{lVNd1@fMP10REQjLx!c=N^NXN|~73x}|{t#{{q_$|4 zC~UBicvP?Qb-Y2Sf;V~Kq7#m7_Mv5pgM2{HH_A^4cfV!r3cUN-go>&`-4Q_cniItJ zRjEfB@XwMdXQaN5CC@~)h&%}#MR&-~+*AK2a)=qcoZTXD1C>_EycG)-9C28J#%ftiH!L`f=68PI_+<(d zZBpGiQ@fw(EXM!vsq=g~HW`tkv|Y|CZaPkj6nI_$h&Qp7PyhuO=IN0cg3Vy(@p=!W z%OhU;slmZ&S0_IM)Ew=w>Z3ngG~R6uB4;f6@UepXpQyY_4b@G!X;#kj#5ukYkHO!Q z8dm!>lH4L6T0(5r@w08uv+EL}AB%hfA?YZ8LOfpn0_vw2nIb`lSo(=V*^7b*F@)mq z+Su5$S3?f5lc5?quBoOZq((iY=}GzcEp69SGbBwlogPhd1y&xSA_^Iu^ahPhfsB55 zjtl}=6fzRs(D)^g5uU4#6cJ(3En_J+ZcLLcb0Is9&IHsL3(gX~BD4D3fcYo%`KjK@m4DRz*9efUxEhWZA$!uN-D=Gl*&>5k%%SN7a$@`L!)GG zKADre%jyKiA_-jb01z5-x~!Xu=4*9UbN~npsymCc%+g8R7Re=KY?)@V8_UXAdjNrQy+;Iu%N9ws3HrRi(9qv$k)QsAmdM70VtS zq|>b;0ubOm7*-#FBK+Sq{6Wg-m5HMqYyWlP#Xb8k89Hu~WNNu-$e}hagFv*#9$mRu zN^or&cTWy5uMG^>SM$gm)OGLHF^g&6JwGJ}H!A%_1xQR5aeBY=oosE|q% z>jL`1r4rdCvz4`QI~Uwa`G{I@Ob>2PiC(T#!L4285UWb?M6KT073xn|9jB@Va5RcN zs0PKF#MRc2<$FCAx1oQ~AJBdoxCpCZnnorUo?_)Sw8cR3-_Tpt4!1{u-(43}_nyG)W~4vD&BBw$}RkthM{1kH!rXgT!4# zt5|n!`@eBqaB08=^Z%Z6e>2I1;Cs)HLuT%J?z#7zd+xdCo|D4Ip^rHM%L}T_;wFK8 z1`_ZIct#h{AOshP8xGTPWq}Y}>5P;N0wyPywdXOT2IX?T4oTYVv(aY)w@(m`00K*R zrr+$GuQ-ni&b{nGG4mRFRo;)NUo1IL9OtxCb`Z)R;U_5Xi|WH22o85;KUO1Sui7ky zcsyctLuNazLvyt9HEZPUj?Qi3?m&N?R3c!5Y}&su4P&LXrw8-@f z_jT*`h-TO;&FUnd|n5%dF&-^3Dy1i(qbZadg~2y33Z!PcL1!M?AMC zXHdQCjj$xUa(vfY!O;(Ev8`AsZ;k?d6`XCpFXh|7D+}%{2i419khzqrL&|W)+m-gMpDa?XCqKjAfX=l?FHAj)+`3-O zvgKPa`^~pLxPES4bD>x34AHj1ZuroKrgEd$|`7n zdrx0?FyU+dk}jLy{-Cehn;5$e zF*CT54m)O1)l8f-SpQQ667ZKU5`ygRiv*fQxH+o-{5eJyp(x%PkQ-X z1!P@qvsxusI!MFq`}e%)&0He1G*~%d8XpBIplnC;q$A#|N=MxJ)i^6`M`yVmEtV$dMVCPV;4tdMYVZHksKTK6&FAj$ zc%J@?Ob-o>y$4Hq%H5UEbcBVgSl>}%g^*stJ0r373yNt%I>uWh{Uw`6`m|r`8X7Oz z2a+Jwh4rM5)Udb-%_w#=gx#d&0b5X{2PrDP|CsnvTx++iVuwnVBXe_Bf?I5z6`kZs zOpMuwVP@?FmHc~bMMjJQ~;l6&GNY${eKd z+7}${;Vwc`wn<7=yH`$49+tQ!?vz9UR7}W<#ka`v`undZkv5`I(1bqIS&=r&m?er9 zJMWOu{BWKEQe(D{R~eNh4VfjURDc_?(78lG_u6Op7UcA~jI9`)MljYuW@^K69PN=< zLiZ)w{Z=M|#FBdRlTWp0a`iw%1@YX!{B+T_&g#|+BfAK12OM4P;VDu>-u%X3;JlMZ zabe2c3efn|qYH!I^%n+z#NQyu`U`&-jV%lw!RL5B*YcUeNB9ZdX8m!g4**FJ2)We3 zzniYr!S5T%7RF}dABz>38lMH@i1Tl*{F283Ok?HNz>V@gK+g2J<%LrRW2A9an@8}1 z2y9gzj0UAj*AgD#Sb6A#(+2amAQfQ8{VT^aP`V6)pIMXu2i+(=;F}dO=O04+vygj7 z$IP$p#ijWua2>9$muu}}vDj*UV>EVXZuJq_>L69BzarH|Y#v=>9I1{od$`fy>O}+9 zx6ZV^&sc+ll7f{*Yv1y2csxBiu<6kaZ6#RlAM$u#*9D2%zAj&4Klb2)tp#}vc{E>C z)B8P{#XRSh(MY-Om3yEC!3dwf^jKtjR1>r2Hwp%NT;TTD*HxIPq@QZ%`9TnG>Hy+` zy&(1u)DOA!>1AHDNYDZ%#KW9LO+JgLv){a5Wyd8e!~WMX19;7yqz~8|%K3Db`|vQ< zURqJPM=q*qZyEbd3FI*iVk{%AG_?yt6^97Iez+Z0TO3R&(4CS!BR%GNxO^`NzGiyO5Y)unQ&jD-33(B)+M(Gb1J83m_vUsfa}WM3s;vBYm1H zf&m#BV{Hk^IFbe>QNB-MdWZ&yf9hVLF5yKRp8#kTq=J?I<~)H(y9F=*?kc`4^u-bv zfb&`SpD;J3wO09i${#A4uH5k4s0GnQ>lZ{Pr32}a8SA0`4I~6M%`2^f6_!E`Wx^(^ z%?RD|psdF8^1v3>IF&1+6^+lP520Kc<)&$S%P1W+J5YS8e9?Hc6ec%JsglYBo+4U* zizER;B|xRPVX1&t!l%lt&Jb#yJHRmVGpYUG8DAK@lusR>MWA^Kf3x%N)%ia~;@9Yn zCUK)bOq?bZ*_;JO=?g>|Tv8QLHmh?VQoeh|w4xk;J-NeOH*Tp?h~kLz3FzybG+g<^zBB z(3zOZ%tq{?gsCqv1(XH>PaE;iBUivzj+Om@tJ~G1xru}`X-DVtQWG2tXo^DD{`q9| zQK^?UbVmby-Bo%q3{L#1GraMwbR+vz2rAJ7ed6qxDa6(Xw-Q^tdwH9KXfe3&f6*fI zBH35qCO5)OYBGt{pf&`S0o&j5^3@0Tbw`qO+UFwEO-Ru~rBG=oR+NLU#WO?tS9^sGr#0%cH`I%UY#pcX-Ubb9=EJ0Dud=ca+SK12jKk^laQ2kDhMIZr`vT~MC!%3=$@!3no?U2 zgRy$J2Pp8|i{R~9b#>xgy_!gr@F(9BXx*P=x-E%wAg-+3@$lK3WfL4%mH+Vm%i5D(!P}INZIaKV)8p0k_Oo)c5U@|)^g+_ZCcQ# zRj5Qd&2L+-kQ%Ai*1hfVEc4WXxLM}TbM@`G^457&EEB*3*Bwe%si)Vy=|P5N`=WJK zwx=hieJ;b5{bd$>FUD%C;tr#Tl~Ec?k07ZG^N6QuSJf7?SoTO5iOVWy`;t+(sVL}V zV+!Fg$+e&nUA#E=CJ0V2J)0K9KEH&9LzKrAeP;CrTJEBhEC87xvmwLU11;B+PMabc zRu%L>5rkjH3>1ma+=J!4aFvZm=i_RSgNqq|jI0Ac0jfbm$^=@(&Q5++c@ih0GB4+p z7_56pF8qndplc?5qU1+Bl0I3|&pFbjAJp+9W+Oe3u)1);MGdhUbD=gbBGUq5mplri zvG(~H-UH*(#n;xPXKNGWTm3bPrO?qYsiU6o+pf; zFYYU;N~<_F#--XAnw4oE(I9p_8caro>cQP?lWtnvZfIZM4-!C`hQbdi3_r3*2zk#i zG+!&P8pyZu^$RDcy;pJTW6Zy|%^OWr>!ZB`SDhKyyjC{|h~ebaIEU5b86!u;7y-6a zD;gB*Gg4Vz4}C1lOW3>kdXW2|a9cj#(C&u18La#nK&^i3a3JzQiCPbA3!WXx6J%ez zPLQ4ZUee~7R~qa*WSZ4FX483+ntd;+Wz7XkByq@lNr5hAE6sdCpdXUovF$71lRSa% z|E=8{KAUG|424h9&BR>zw5;h`JPdr|9;E<3vog&*BJ|amhAWhYUA0rkyf62SKgkpL z<_rU$%`>-tOFA9&-c-`f%5x<(i$5)E4jv9ZE6?0K4SA;g<>~M~__H@zr1t*)ZfwIG zZSXMLpp62=o?HOqD^pqj44hhAi&|En15|!aU>eCATW#_?bewIcOka%eB=JUw1u=#P zoErEpA%I%3%l4#J`^6(b+*@OA-@t}jZ_fN4(KmJodm^gYbCk8p9fyI{n&N_iQ#)Z) z9M$&xltQqFFpHlfp7GHD3&B*;9$O6Y2#ydUt;U}HvwnL3m&UNnySibt`NKxK}+w6D|cYp4(?_;p@_Z*c7E7V1);3QI+rikj{XXf!PpYQOf*O%G_cr zg-KvGdT(aCP=C>Z*7; zU6H(xsyD}M%a^MBz-I`q?DGog*6co*>4-zLGJ@U+T}d38zZ?qZ;`IUkK=8kaKpfTD=fi!}c5i>943pinoMI#8UM>p}y2WbK^x5nJB zxxw@d=jCh*m-SxHce&{8&YB0DzTRSaDt}qVEDCSKRq5r{JfMLv0pExSf)zha%bYi8 z0MTDD5;J#t>_I}FSQR;Mk(WLSfjC%Qhfp3iM^IIiv|_2tMTZaIl#Oyb-%DAGXS>=; zN6TuHtth0F6*C)@v?SuMOLW*MG%xe-ls|L*zPNdb>EKKl#X+P_HFx%h+kLt16lz&* za)t-E_P=FvK0!oDix%B)uvkS$GjLkOv1T2*WRplR+4yrbw}8HFW>9TT!*P+b7${B@5CdY zasY?mlWXkVyMqVL|)-07cQ0X%06f=3pZbbOW5leUdNcA@?^Z8_z6HpW0MAS7ob>YGcjV6;!p06$Hr+T0$bfsQ-kxUG3so z^_puyBO(-U|C9Mky1D6^gHWgWB07C1F3`z)Ui+Gkr4QNRe+}DWxM_kevyJ^(81gXf7iGRX2 zg4{sD584VCWT4udJ4?ZmyUL!W$7*o<&+##1Xq~mkym@vWB=u zc}Snlh4d9IX#NvqOGjZ=%OkGR<5ftN=~}{wtq>;&`ik*BxGHD7qEF6_w`)OW;3}v`c{Pt5CP;quxIDzhDL+*DwZtveWypkvI9x)8OHqSKbp<$4G zEa@hGP7b_U*5nNbFYjUf`^1;zN&mk}NOQUPvU%nU6}kuYFX`rmujllyWzD+kVekd2 zINxZc3m%iX9D>h|^||nMJem8O`UC!JBv0Vob=BVR+B`FFD7=zx4$p;G%Mw3epYUp> zKR-GQyf9J8#CBu*JWE=<7)sO$m@#weB&p$TE5y{!)I4FAhA&ZURyI*qJi}lF>f`O| zzaGs9 z!ulSghVt!bOKy6YNGy5}mN~D=X5v$?rbi0v?3)?NizR}l^-6tFU@uyU{qncm- zJ`GaHY7<~vlPMc50)BNgiS@*8fuG$A-E^W5Z5s*^SomqH)V@D%davM1XOZ<(Ks7u7 z7G$Um{hBd8oI|Iz!8{5=BZ*K3V*h2Ws3FR8(FQQkBb6 zp7e8DwYsSJiTwK%4Giy zHurm*4$-%<&gBfxSxa-yo%{n&KD%F*Ca=!~OzXoY;qNP4n<&zURVcr3prH;04iSBI z*PD2kO^n(QD(l-G*t9+E4QvXPF~OrBuk2}jYY9Gix)yVWd6cN!prN>OW{3lbbd_!a zhrTvzcryTFhd)1O{er&%`j1kvTzmjxw_?b#j?tBn(k9N$n5b$37 zNaic11+Yb%DFl4YFTsezTwqM zdBedQZ%8-~&}2i<{O3oAx5%v`jZQLmZ&mhGnDCohs$EW%tY~PmrDr<7waa0~9$gMp z!LP2Bs7E4vK~{0&`Q%giq7M~OnJF!CFm3zVpgqu)_Yz0P#bpyuti@Tx#dMe=e&x}H zC^gRO`4W@Idp?%7f<3rD6Rl{LsCs|8<;%equ-3oBorkEtuncU6Sw^Meyck7#yk3-$ z)5ONKELQETVBB(MurKP%`>N3mm2u!LJJDf z?D#e@55xeqP(h8EKZ3Kk8R>$0hJY%T@WhX-HoUiE04Nj!Ew7Ud2qE-KVVodMeU4+* zJ+$LycS^RLYU(5;*3>7ev2(7q11hdAf7!g$Ek$9NO_valM71>LZ=|Jmicf?4H5ZQ8 zbga-H{Ptc_Vr>h3sHb9PT4gH(z6BRUwDf`A?)HuB~5H@X@F=Ep`3Jj^(+)i=?V* zWBO&j#35!kK?FmVBZ`nf&0smn!gVm?mO7(tL|e`~XeC!x@jF*n)f8S}5OA?()` zA}31;7&smokgaMqo{y0SrMY6Zm1(r)ch(+T2*daj09yld9r#Q~?&BGF_%khSZ^wj~ z+2nByG|&V3X*uK<%lqdN^J|1Rz>a9EHRe28r7un}i+im5@WJ^rEGKn>q;|k)bG>!9KAJk1=@RHcMEv z>>r0RYI{s&o1!ID6%)A*Fb^Ii7xn(Uf#d3v9Xkv5&7UPt_#M{M)XSA8ZJzm^J#=L0 z+mUqh{nK;!ot8CUv*XAX&F-(j&oE?Kfr+6X7j!eYR9`y`)rPr#7uhLhmz`?h1KQ~(HF%lYRq3Qm8OUS z_3QV!lsl)Y+T7mHmz6wMCZ0~B68>jf&o&hg^8}g3a9!Tk6l!ZK>6wikV1IvGQ$<_T zjJBqQ<_|@xnatD>`dH@OH$Ej#@LBY&z42-D%pw)~2kjq{ZcaEY2cKHjya~f%t?Y$Q z_B*ZA_26*(-5Zz>4XOg-v-Vjcgk|C@R)fRK3suoMs5J5qf>QItVHUo(cN?RJo8U+& zj8@0nyG(G-dQ>|O*GKk&^$JWKCh=VMD1%15kT`tmfd%Qrk#+6!7ZP}jL%d8QfRLhRYNadBB_CBS63xi`3iW1Jps>mE*XHwzb|-hI#m%cEIfV>y2U81 zNUlEvk6+-qbT4>heWgwlj7+f@5zAd4vNFn5&N^o;P(@-(=h0cwy|xaprG?niTYTGd-T;rOV6q?$VzB zbV(g3A&n=eJdWpu5$tvk12Y_v71<+e3SOC=f4c+^(wn73*e(A~v6Z$z~xnM4Lzp#0xQBUrJ_?x7g_{oZDAQJxJXjzjtQxb>JPsfbH9Qy6}V#x0m zMLGGx(qsk6I&q|~z;`X8;!yZ(o_R%u@@ zn`c%G?N8Fp?A-petocxBYzRJb`jfFsf4}<1-s7`*=8Ll>YtZ;4-MmnlGd?YA*6pJ| z_7|;m!C!~jUw}t0mdCL{h}hDp>c-h3+>7iip z2%ZX)=XPnV)YSa*(}CbJ4RdYsObw(+AKpwKHn>crZEm!uszeA$ zW6Th1#_}VjKRC&S4U26H-uBrg4P2Vs{hEj_fV5_A=HOMfTM$UBY`HK+x>>774t~o{ z!0%TaOOP;R(VfwduX2sC{CEd)^Zo_<&Do~`h z6mwJoA8_W#@1UU&vavJ?yTvYs_}{d>But=bSi7K8tr@1CvW!*Bsdu5oTL6XiDM^H}22 zN__`H^Q4zSXz~sgrCNKOo5<)0X-h<`OBz8cXbdYrzzp^SQ8Dlefgu(x8k-C_JuG^CPx`=m^L-LID84T?6}w(Lpl{v3E`@ij+j8uSzI2}aK2L|xcn6zI(OLV$g|@__t%{| zQ{q&4dv7bClbL=1_V!-6lM2ntsyE#aS@7E)T#wfR6g9e zllxo(Xja!bQqp;2lyrLNwbCgni@dJv4zo&?W zYolhR20Hv9S*hAkDj#bM^#3y~7u(PMf&j&erg?V!t*pR$e}lx2jT|6cIFhbs zb!nMou`^9ey&$FLP>OqsqYji(;q=$+k}GzKwaDF4WIjb0%89HXDKggaXx@*=1IhK~ z6w7>g6fjNR#3dJ4Px5eLZv!}e`v*u zfr_V+rLFTf&?=4?m{B~D-!vMG8L3Z@s1Lx4t^cUj-`(jRL)T5mJ(R~!v49$Ley4qH z)T&Ag{~^akXCu8g z6g6Cf3CWrN($QutMnc`?{o>~?VyfI8cL& z9v3mMdBpx@J)sgTVYSNR!9lpie}+4#z;y`*q2wsUaoBaj&4oPro5o4%bjO=m#tAo7 zl3M8Pm`rC=d*nv3=^*#TKpc5r+iKpO7ic|##-@_J=1qNz5jQthDPCj>vEb@&-m_m~ zYV)2@;_&7@6B7qJmoxnIi3FCfVJy>V-D7HgFEzZ3BTUZdR4rZz;%1}mq_QB;+6@j| zsy%_$fwBS)14QzQQL?wJJyJ7vN5B`4!v&YjQiFrU}_Lk5!Zr^xBr zdTu<9^(0d$Erap5F|v`hKKf)So%N(>{ZE`QYT$hZgHweSP9hk@H1O+Z-QBS+i{CJF zOoZvVA-NXt{|h8(%1) z>PlQ~o3%8LYBcVXK3J|I%Dy|!?ZbVrkki#eoH&$nnoe}Pc|#XKo%yBah!LQjMGzat zuKk#iqChUjdG7N%YPkw65vf80o(A3A0qNq&C-psyvqhnPL#KkhU=4Rn8l}?D&QWK4 zDMb*Rz_2`sT)EK4TvX^In$>zsIW?W}FWoWyy0-6+GM?>MYofBiM(N zD(*InbUNs)+T1-OGq!Wvy$803N-AHxSNKw5#J%#GDX__-2JSKEPg?w*HBwwIX^sLF zywJIs+nx-wB0h_44HflL9Qz-D_i-M6;n@J^zHZ=3chDURgw|dt8oa(@BJ}C2`Q->5 z60uoc&c(pzYm{r=vY=Zc!^9B~`lbh(F5TcgW=7MR@iQW;eKSTSyfelm3)jzroJVZs z-($pi{im_U3D)Owt$Cs{GtLMvT><^X#?8d{bG zphn)>Ln?u)0vkW!3)kSypZOc#4s7-XHWNopBA=bbxBTq40{Qm4v;K5!e}7=}TrYVe zB<04lBvM%WS-dqH9k^DG|Kt|d1~xAo9S>~2yhzI2bB>fD-B%yjeDz34dSJerG)jKm zdba%9FxM}EvksAPTvIkwjhRu_IB~}GHRA~n7TDY=G1mp_QSgB zl>er8QKqxcmk<`O+S$oMsxg@)I%zB( z$r?;A)?W7J5kv4js#Xy0}?OVQD{W_jT);>u>LjVA_5E>9zR9p*QadL82T2Jm#{` z;M{CF{=$;gJ;c{64;puFl{4E$SP$&wb1ek$@Pp( zvQMAh*a%s^Uh%h_iJs-_oq}B+NcCnB)@b|BsMp>5-ogUTSGqq&Q_qxl%8R&w2mhBI zuN+oGTW3WB5!wFqh!v0{mb!ny4TBu9g6+40>#S_Ym5^bBeL@d+pUN* zgc=(-V!d~QqC?W_N$=w-J3o1pwf~;^6LwShuzMcZ4RPYX`5LJZmI{Zv6})wU*1s{m z4HKO=w9G97jpk9N*8KH&uqo1Y^J=2&R zR=zjT)BQ-G>EycA8qK7mlk7xBYF1Gg#sO&6T0zD04RTcbx_Y*4I=TJoywr@LD~HDB7=nz$7Ks{{Ai7_kXmx5X=oL_g7+jb<-Do2NgaZWPXN{hiNu6p4=~0yAZ38xOsx5r4Eddxf$NO65jjiivs3e=a0XDe!vt{8+q6p!N*(NJjnS*P9d#jQYU)~8QAeDIru!( zKJ+{^B!97-_3X`>ZKDHwGxT433Oob;GZx4t#Bw4T!XTChTHaxdTwBV%b-7hB1zLVU zt@hLNE$ggxu7?TNZ=DsLnrD8SU>IYo3G#68&jn^QP)!SX3%{S-*T^1KZ^Fk(hED`i zl2a3TtyE(Qv@{`nXW=m*7Bd&3#6h1KB{G@$8cj~D!Rdr~N+TN<6aVFRx@vhpMy50t zsCBLuD9lj+z!2r)Qwbu_^21zUmkj{>vEfV zv*lQU!mmC#7GbgF20L5*xxCI>I3Qx8C1r60>z%vC%AWM#mB4^5g!3vdsy_H(&W?J$ z7Ws)3Au2^vZ!M{nQ1Pm&Q`53cY?aptakLfleQlsJ{>=0&0A*K>}i@ElbUtY z+nDIp!deDtpvk!&ecEJxIz)T)l8&6je1wU7NejZv?iX)qVzQBS**U;G_(uFI^d2$OQcm+b zh1W|UnzNlJ8B0Tv`Z9xM&3;Z=--~7SvuI#hc>Xp2U{96tyfRfviuIbc53ui<3O_9n z*Apwm?pgd3{v8)7EdZX5E@kIkCVXfO<_rhc zI&%Y}WI6S6>CEq*mE`Sws_WeDdh@H(2U(C~KF+Xkq`u||<}5!JkHu@9X=!5O8rUydqAet~zAT>f%|uf%jT-B=NM+)(CT6eOvzD(-BOa7Lb@2RP1A(nBq>x-<6~pw)6(|JpHIuQC zSv=6vJAK)f;?8UcH zCXa2e^NMBgIG|ut3Xd{7=%xMZBkbe2dh^Spqz63~Tq@d1PDSnBa&T^apA3)qdUM;i zrJ6346J_T`z2ZXmy{iUhpx(@;dGRwQTDzZj5xS~tV7#CGJ3C&c!qU?w(%k#1Vo04e z*7+buT{(2}F7`>j#mq0NzUVJ_9r?h|KXr1YKViuwo|1%=ZWKEO}J!yedDn z(-F_{P6w;JdF!aSS-T}`Af7CGa3-y$uc5b?nL~A1_A%#r%5wf$;SRIu+|+zugEwA# z-+D4kzdD6rP>Go${7HJFr2oHc`jM$MV$Qc;y%W=xzO5~Z=oLV^(r2IP;s;NsYv-v9 zY;_IG8%CJBpO!ww|2B8V-+x38*$|2Ps2j9s>(o|`;fv?1K#N2`!<6v*rw(Eef*rO5 z7dr>Uj59cQFn&^V#3Y0gv-efP`78saV(^si0SxZ%?8)TuQhz!2kvpH#A*5FU9!7^B zo}yR{TN)EM}R}FIh^knr=r9aJm8-zNs+IvoLC=aDooGR5K@hJedB4s@1X3EqvjW z|A4wO0jcFLm-k`OjlM%{yc3gRW(;G@zU|TdhBXOVdDsqGKR9_%ZZ6^>Jt^_jzDpoz zN{Qd@yF|p6Xxn!QL=$P_;(eDWu_eyfcZpJ4;?RAS&^W3CM0P;ez!EvgI&%;LWQknW z;5AP@p-Uvy-P_K}1*J4TCT6zIkex>EVuI6`hEunyOQ*zfx@jU|Owxzctb#zx9H~aJ zn6ox0Tc-b8(x7BrS4vj%nlSsRY#}_4pa546cI(Cev6c*`Cuyr9mOINRfj#-b+5~H_ zHeN@CsF|dONZQ|vECFfsz6F#`jJR(Wf9y)!kJ9EnmCCf_?yaOwEsGvOyXs^ z(oEKFp%yDY0%@X1JusukZN%-fk@*7ksUA4Atap2RVHWHZE-l27yJ5QW54p9%i9*7O zUd9r05t{FoM=dwnebS(1zZW<9`{3MMqHwuU$G%IrL~--JOSpuU*jEV~DK5Jwtk^uT zT&FmO@mg*%v%!I*9r&0o*Iw}~Fny``kqU{_7fGC`iwNaq<6)Wg*YalyfezwXP8V%~ ztj}7r;v&h{9rFgspRX&Rj-8`JChYf_qj_SbT{|Jk`jce+Fq?Hg>{8}ZvhI?sRoSd6 z%P}?UcF9_l%{nZ#Mjj+iq*m&g`)-lUQ?r?>hGe!x+6ykWjC0&W8OGU-nB<6xFvB?o z7vuF!CxMJ4H!DPSlu^v|y~lc>sTu0eqWnGeXi+LVUW9BemotGxBrZgRPn1sypR(i_ zDJ2_X?@xfI)}-)V!+K<$UJjkl<8U@ham|q;7|r5Z+#=MPXEvyNmCBw#iztO+<`~q# zF()!k4lExn&tiU%Qs@;;%_@cHT-b)Ew^AAepn2vz8jYC++O+TFACV4Qnx=}|xl+`O zWO`FOD|aEB6ytvbZHnou_`*8eAdJXIC=$&-GYR29%bSw$d?q0pXxSzS-I;`vK+8iU z5K3Zhec}*UmpoO%y%`sx2Ypivt)PnJ6v2|HjoDn`T$I9dGbL6p-_xJwF7%h*VJhXg zLr9kAMdMOWkj2P_uANq*i%KP;raL*C^oLq=dmFyb>N!3zz?k`{3wtHBV_}Vci&9c- zoig3xvW)v0=kFju*F=pv+2PUM7mo;*^y!DJcBu1t!e#+Obx3X)XzwasWo@Z z(`C=kGUvt&mR06@{9ZT|%6LEC+Q!Iy%#`(tEF~8n5-!%#2j{h&kt}`8lWdl4%pCA{ zA&DR)QEy(qAWIUQM*6wLo9juOQ)_VG^8PIE=;vp4VxH$mmOCO} z`h{h@VDx;$13~613V-~Z4KpltB4mp|8E9!>*6YnHu0sp-7VsCCMXe^^l&{O94)K47 z@!>t4#S^QIo0B)&nG4~ZP#1^rh~6WpQ){j$AGG{ZJL`oM-n%_tRp8j&Bo3%I=L|05 zuF$P3<>VC1$j!P2Xa9A$HP}gCC_fVHhu5&!N-})fIWW5pe?}3rgI;u{Gs=x52!Cq8 z-zw%9t1)#{@s0ftjuA5t9GBTUyIeVji63uNbeTM^ zrSU9zAY)Bmjhle#HDOMO3+8raAqhOOtVP-qA82%MTiukIBTl(KAXBp zqZ;TEdv@(Fn$w?}7%B=Q&VSqf-hOb{A>O)wE*4*LFN6~N?C&>hRoK7DQg!vY2RY%) zq&Gwy(a|x!tA_8d)b=MT-LJveWoRR{E0=^^ty9P;8818JgXhtWT*~87Ej3Pb{GaRX z7Aqeee}pok~v`)?r+GisW%sYAndI;T_a}U#m+ri;1DS=n*yaxJu33;8AHIHU3C z&=FDw4SmISX@;RM&ver_!@ zf_haFb1Gzx?#?rBEd*4I*_*fWNk7ueh_P|s!T?ukgt%RG;=H+!cj zd_FGg>dkTXJ6`g)`sLMQ&tmrmY_iSBjT@7p7~t_WUoF-m?U#G&(W74_CoZ|pc*6Ss z4W2YExqr*{#P|)dypyW)l4F}Y^P9W!Tec_vQQnyzK^%o0Y@UhJ@eA{W#FP17mfx?r z$1j%)?W?@W8{F77siGl|e*seP#pX(kb5kuET@i3rORydi3FMjB4|YeuscN&Ix(Jh9 z^et6FyPKShkF*0>&y*g6<30X}lYd|Tn`;UDID*Iacr1UczrEVq{Mo3$wL%7gO+PHX zsxa6ey(!EeEH(dy@>8H_V}fnip>7%tq+)Wg@U{hQj{;Ip9#HnXzcJM5$%oZhwRpF4 zv9P@v%y)y&{Kp?;TNb*_)3LaZHhZvG=EZs*t^@MKb3nCu{1WI=`!4UKcbk0ulUEi7 zf6V6rKFxeQ0P6AbUmll`#L~9GCO`j!vO>14>I|A$x+#nSXcyRt5|XM-><2B znEEg^JBW1n2t%(5^2e9jfpF+g7h-wsPrXX?pinZu?byI(;UlY}1ZQbU5= zS8B%V`?u*d23o#HKbd{oC4#Dj!L|%rz}PN5WH%LuN>CWs5$N z13>!0%2yK;hAUi4A#K&(wbb9|Mrm_vFES3yY`kKnv!N{o4P@ zsd&hFh-B@*#{BYkgZfuaYx{rm)dG*43(lZ#InO8vk?EKEQ%ihJheA)hmmfJ5X*p(& zlL3nCkvNB&?&j`L<)!|{H&}nHA%cT~6onYvNdmSV z(p0f}3`LXjLblXQE%hj+5HQ^ARKF)t7`%zkWIk!u*%m&WY&1>QKW3rLpBAo~-;O^N zB6EBpQ$APdtaMjiAvV&B7giQ{%XEFj@{ zfQmh!)Fn>*aL0rF+bQjf8L{5a5c-ntT@QO~4VXrcRIuc{q`U9o!o>0BohEteojk}n zjMgl5&vaTT1-_e@mW-&TB&>`9pOrxDU-uT~ctmA<)ci=zoxE~|Yw2zF%gD1bG7Q5R zTSl5Sm)e4Q0ef55(&pa0L;X>?gUz5r{5|+ux5pC`xOQi$9FVFKmKa(h)~NlmTI98F zUi%f^^u)C%jgaB0Ppq`K!r|ot*QjhfmvZUZynEED`GHOAzgQ)Vu-))SJZP?1qNvF@ zCL>f=QR=i1uQ!=Au-3nXfP!(el5gU}dC6~e*=I^i17}~1bY3V}1jE^k{=d-v&-uK@ zXCt4d_zcI-tUc)Ae=m@e-E1!39suhb#D!+q_vcG9?JVchSY(WWr2E{2g zTOT0#T3=2XuE#PZc>A+a?0O;8K)cxW;+Lj<*6%&-rRyO1=!IWqOJWW;h{ubjK?)ML;=niT0<-|BR(kgz#kuIkk97$M^JUn?X zR5@Fo7Wx|>2hSiwQBh!#)ySJZoM2C?F=zey(|+q_iUnZdhRR>=Ggo}mUEZ(k$T#2wR>cfKuHpycJcX3d)Rqk|L1leCIlO^ z+=R-ho#xvv%gMNVRsS4*OSVCmpDA5u#-RL2$sdMwY^L@A{n~ifvtNY%aiWzP)z>A@ zUZ=(DSpks*;RyQ^BbV}=64T~rH_u2?U59l7oLD~#>eDAkiOH~+D%st*?#fp}|GcURo>WrBx!(*M-w{fQH;{&{={MBNuU)cl>La(hOLcfnJMqfh$j-yAhWh zt_w&?mmzAR7byIulov0AYC4E-ND@C>uAM9*wG5mtpg=WST}}V91oW*nR~AW~aPuDA zB;5^u;wGlOdQo$hcmgdy*R&a=QCU{r`FQebW|qNOprxJMR86p+L2r*yU>0`p=5_WZ zInGJI;ZYPvB_I`aR9yZArL9GRGYD5kl{h6c6l@*296HrPydYH#WrPOWhPGR1nlzwI zqG7sosr(WRQ#b=v>a5`C9@)ETa+X4bm$h?jtxOpfJypb~G|@g6dh1dR-pW@~Pc-JI zo+6Z2YCIkQ>aPqT@Z~4RH}~SF$Sa4RPrX;Yi(s%gu<4Y*ru?b9lV`Bc$rF^Vc_h!y zCLc36`Pgjoq`}EyO&&G%QvwuOseDZl)Ponr&eqPQOOoDH_tZyRS4B#qz#6n$C;n{Y zu1@^Z_~jvk>uIT4q}O2ghWwUJa=gjH=I?m(*nFmYl3sb{JYz(>ely#2e{u|-%d7Mj zv#lt-|MV-p$v|o(X>g9VqUJ7dx)9{xTbrGB&3CO82|;U`caKCME))zxg{MPm^DnLbrTRe6r!u^<2Pkg&ejKnHK7(MvA$* znEo8PjaP0TFVu||Lw{j{kSNXGjb?iUkf7$R+snJ%fruNgNZtd4jO}yg3Y^w zgc;jCE-|Kg_a4}jnzW5nrAeNbftH`%lnL63TdJ}5$} zf^7jFPxX-hO+N$%k>L1`w6F#glcQ*dvURbu8C_>CS)`ePIfjK2W2PUI z9O*^_2zE0)W1w#YwL)aTQ0g6COK~`>4_w#q195N(}ZxOAhha+BcK3$mN_X*O#%_c=qt|j*T?kiLF&EIA3CYTpTKMJ zhKXz6ij1PcrK6r*Khf=A7bp?pP($>PtP*Jv#R-#u%czfZP!LOCqZ}Wb`~Z{10yAHx zcQDk#Fnitd=(JNQ#Qc?sx|$)48-%1l3!xJF!Akji(=QRv4W&&n_q~`5t|1RJ?>B}1 z(P-mGEzr^j&cWU5fWSCrFcF9#_{&5+O(>*N;;YRK$)Ryeapfic#`^_s$fk_Ogy2GT zupT4I=f1v?tN|kWL5hmU%d4Hs)nw)m>8*3do4>}9c&&191q_=yk3OWlq z+4y4SAGdPDgskC+4N1yqscOir%sfs`^OkUBS`e2YWJvNNfWxp=)~a|6ZL?jlFs@r7 zl@}p5QPIlR%-S{N3wmlBc<0VFl^90iLLi?_L|urUsr4hc5ZzA0dV;iVQ#fR%W?E;7 ztoG4x1q61uGzm+h*^0UbnbN4V8f}}uTO_8^YI6rBfo*fXkbc`H#l=9q$8TQ0RK%_b zGVuL06m~jSqy6&7O^>Ey2irekE)iP6e?>~;ltq!Zf1{b)JT)ENzS@h)FRj9hg%R#~ z5;i?44{FQwuv!ZT>EQ*Ydzu7?66RCVmX|zEaJAU>L}Q1xFZOXRNbOexidK>=xM=S7 zo0Hrob~nCVXZFanz@lU3W1WV97tn%znSbO$>>r*05O$WBd1L_;DaM!`RgyVJBbkfKE&J3K}t@S{!SgS^B*heB}fm9b#+Y)N4P*!e> z3A(xZKi+O()K#uN@Q*+R0(8HtWwX0qIE`nge=4-rP$VL>6*C$Vv9Z0lw$w_9y!5ni%qmHO5*K4WWZKt3Wl-b=~c@X;`r^Xv} z_xB_Hhnjo5YTp%U{(My62Xdsfv8LNk7x^b}?bD>NHFdN>$YQF%B$dE^{&wq)cY(qo(H-eJDrg3ePdU|hQ9e`nx~DcgC5K6-v2?u?s+_thrFzIl`Fcw#EIaXQ#e+*E(^meW|Z49@<(6 zuPXRk<#SD?&h8A3t#>U4m0#*Vb=fW5T8P3}cLDqn(@;z2HAgymBQkSx5%zmy%o1Ce zehVm{**2(v0Mxp@aZ)9KBroGv72k+5@!%CE(GqlKZ6FN>POyLh7l2Th$S=53+sK#M$= zKdh4u(6o4CHIP|U80|FS0#n6RhI{0H6ET~bGn%)Q$`zoa7X*04>Q9bbx_GqgzdDv; z57%WUA+A|sxH^4=tRY-Z$3LRheeLVVmWgUhWhVPbS5G)6OmZz zHL(CPe^(F4p_b08<9CTqu3*A9^+WoC%}4Wy4Lt(EGhHOBt$o_4sjn4$j#r%P5O}}g zEX`7nU`j*Ef$pNh4bv~48N+{th$W(4PDN{43HA@C+%2Ho^e$J>nfN=Kd3>)-NR|g0)f)xca!Q%)Y4syWwtL+tdfH6BTXq=lL?~#(tl`KO5}n->m=4XDKq$mMWc8p z0*7*l^H2SE!N)1}jITRon6>clK&$LeoK{X?WGs5N?y~mKiOAG9eI#Zp>=l6)v5S># zE;j26p02}NGlOM`v`;%$@G*63!4Aymeo)SK!(gWY|9jMM?#SR%mu*7>GtsH<=t4^u zb3Rryur6$s*88MNYqpB$uCz+~&?r939dp{nEYsM_Jz13T$ngiRYEM!Tg;c#kC!Taf^=Fj&K zO$XcZ%B_e6O3cM58&6Hllc@*`$Pp9L1BD2OjavKPQ+K6j>G+b*IJFs2oLgyKq50&N zy`c$f&7D(s75uxv^Z*@&MfXxg54zh<#Do*K)g2nv7r$5ZHkSN~wxcK=0ULtR@p73; zWuQe)UGW1er;^XK=%i#wOaEH>xM;JL2TH6D$g0$3!ScTH$0~J4L1-&MU<)w`#p~xq zt9Z9j$m!yJ)b(cs>BX1Y#_Eiu3(L2&q#}XM;&L!>?SD~-Gs7!C;mk0{N4Z&0;4GZB zSFre!hcYI)K&Vh6o>hC?W8B^>wdQ+BIwqAp{!^mQ?dZ{`$#*ZpN ze^reQx4fv<`1MBCRYyR;35v6n!E8mU&J%CQQza(zhIY&YxI$D5qRV6lU5G4WiuK8Z z5Y;$m8=YDq<)q#f^bK;WJc)z&GtU!f{Q`VDf6o-rS53XM1wtmP+I*tczuwk4-eji2 z6H?(H*$T4IdM8K)giCd#Q(wa!z}dRW2L>=?ymMu|vxM=@ih+KjQq+nrCX&IKAeTYU zk^v`{K=`;xk;zMrApR)tako-a5I9$wsA|ZoMxYbgS8gL5$73dAMQCNXagKPS%Anv| zaB}E7&?5S2nh41a5|4&Zw{DO-oZ|Jg2-+lWOs3B9)Y&j{?VFKN^S$fkP(4GICe{cH zRaAX`X=Bs|yT*&xk7L8MJ^{-HHL?@(seB72<0aHjJPiqK^RUO!f$BdfejZbL(>%enkHW26pYq414}pkiL^&w1u`9eGHYSgEMz zwuY$FxQ&03XX>mcj-k89-nQalMjnq~d$i_drzX=gbW+-IQtwGZ^hAxf;5gzjqW5sp z#Dx)u3t7n#nM=I#BOU0dbciFey0v!^QkmC`hKbc|2Ll#mAXJ+Ls4U`X$&o5&mOloA zXKrQH%QhK{%k;`xXP8rEq8BmIBrKCFy058Gpk3;X88`ua9o_0Y@6R@ZV0b{^8D1}{ zcIo`6sj$X^713!h%V~LO{{|?Kr8Z+dKfw@AE<#Q!)0V#Z=#^tYbEQXT>a|w~X6lET zVstr{GJ+2nnw@2qw9axbh2(ua&uU?D=q}Nz!*c`IJ;b+m>|1~;jQ+LO{0G;0a*!ts z0hjVrW0sfd6(0e)Ko`$u)XoRFSDskQF|^Elsb>7BAOfvFp+R0_;h}Ci9VNZTJ(eDU zbE-G<=z(zdsChwOm~VeG9f~-G?+$9oa*=ZzVQ9>IZ|DHoe3{d!Oj3cktaO{i_G*uPy#+Wl3i6Cn}@9LQWj_@&!ar zB$Lqv7@Z7^;gra5IJUSWYWyqd6~ym_E!0naw3??w9|^lq`=}$xV`?Q2JXW-gLZ6O^ z0y$^bdTWRT$ICLX#JilB(PPXrH|Qn_&DCXk7MVIx!P_?i3FD4pKU~H+#r%sM_7xlL zmg*jT**`wXAVNv<8ni}pcwHQl;`!z@EiSh`DosbauRs1qY#e@67`*!C!r<*U6$UTo z^G7!=vuV2i&;DxnOAeE6Y;|=|7fOwn19e0$pdO8{d$SYlVGqGlLk)Kmz})4-!0`-k zdW>B9ypiAhC_V?DH6TTANy=)fWwV-Qk1e_}xuV!y5yjT&Qw5>d!<_%fV(KKPnO;EF zFRsrSzOP$p_^Sx~dgvogC#pj%iZH3hrO_P78k(;aK=TXQQ5yqL4mM>OGR z5P6jgru4Yb)u_&!S);sU9_BYY; z&dQyjfMDqD3BBkqgV*^)W+;utxDJF*7cHYso3pre%*BOlvz%`X^5DU8|L#tkY&&;AX0GxG4mS(vO!ohjGT)B9#}MPIIM z&h!=JOSRVRNq>)MHC@|WE(05qPAQ~{A1Je_QKVQr54%xo1|Xz=(I6j}Qu{`Qwn`MD z2lrKZ^TpgQRM3?O^$2b~8I#^BpY&sabnBn4^(Ckn9y+D|aay0tsmntJAENhlWBpBO zQE}SZ$@SRqWIeOBJ?rnqwin01SpZTO`L@9^+F+5khkd+2z@@$0>{f0%AxKfYg&a8| z>B#HNm+K^*orX|31(*haO+-GtYu&9X1j4E=rFY6_Od$1sqO~)gI9L0x1)PxWf3Eg_ znjKH2MmaiO`jcz%N%(+DP2|i8s$cpGN9}VkdH3f9s7>EX;aTyFQS}m8B!lM{jO`LX zh8{{W7v18M89R&uccq9J;@?&1VRd8Nv6Ugr4q|XD%Yxu?b0~+g^Bghkn92Ak2x1bW z@E2|V!j&gxkTAYmB*ek0AfC~{5w@0nO=G9$Co05~>%-y7ryD;~zZA(R=L@VY4sa&W zh9b~<-oF&)*qTy`liTU;rR}GAvqR|kB((4NACiZb!L-0v^!!Ig)O+ z{!LP|@vOA0x#A_I^+CvE8FvIH?7M%-ll~{^p(eL~n`c%G?O)Q(?A-pftod-qaQ&Bl zMgNkgH^divA@}$3IN}HqWdW+P|cm*}45| zS@YqG!;OFWSM)D=I(|Le=Z@dznRoRtFlhcI-E4g>XZ%{$Trq6_YjgYWxHb2;kRZe& zTa?$4Jb{O}aV)P~cx;|oG!!05Hz(x6qh-yTFARr|j<4un@}&Q3)e0rIf177sc}p4{ zgbztKo3`iRL(7^AhVB3PujpU$bo|5gZ}ZHeq5Vs`IU%=yEo>A{E}`qJ)1LrEo&|qwtxS`ee(m!)A0|}zs)m?hW0P%=7ik-wXAtl ziDc;bOTMCi$b@S$Z*^|1Z>CheOaNS==WYo1ji z89M&xSM)D=I{sn$w|VACJ>U$Y2T3<~KAAIqEo-WW?Y}Cw|BgjNeqTN0_l>!~)$0(B zxNzYs@jcJ)-ZjT7GNzohL?06s!v%b(cGW3 zx!P=V$*&jez_Vp)Oeu~j+P%jGHU+!h@oor>LZ6Dgw5K6o4&}{n1UC3lo1%d~%uF1p zjH|l5f*nLHXm!EikJt&gVy3-c{r;VLe^!DNA;-Un^|LWm2ypwftpCUlh2p zyL`L)eTp`fZtx!`j_pSfJD@4F_R|aG+eJ+{yPw&JJNVgaMq*uFxvg;r`s#syvAY`-+0kjGQIQ;)8DQ=qwK#F@>HeK|AG8s^uJ zadf!j+0Wa(m6e=`I3Y)xVjLHOp7v==lM^&Zq0_;<#7!!pM=pZ6p;rS}LFacM!e(+j zT9K4&E};S~&ytQ}Np6a!iQ1vOpU2GSNi-7gG3|4=HGevC70*G^#qD!{-u&r^RU?{B zeLBz{d#L#{EUM&0+H6ilvZg7 zQx>_G-HRTD%If0D!|6l9h1>%%#>@#jvSVqLE3;HCtwFn?ebL+FUA+etJbuYzhpH#h z0eXA;MYqX(rMEda1`d^_#*{&G1zZ0odb@L=^8Z9{A;2{g{|kBpX)?W;;5f1JzPf7G zOEI4apQz~^80E&%qEjj)zC8rR<$&!~%Jy*zUyOf5!9!`DM9_w%2 zE>tWOcGUksVejO%ZeKG%VZ3##nhPc%oOJZ+QpvU-u?;bmV7RT7Eb+c4*7(-HH4v#&vD5|46!r;@{uZj zs^pN*%Zi08`OwA#nJSJ;KEhMbva@)COEG&{OmNi99Z*gzDA9sZQ1va&im>d(W|1B$ z2KHO>y*AH$sE+oB?C;t7TWtN};p%Ii`SWn~JDy~9n8R-$><{x%l2R?v=jG4F=nnqW z;-XQ0#>L?S))O)Z67xI=6BmNg6k1D4(}k85$J=DJGVd#x-vV z)B2qV#QL-CGzmwW@?n?j3AC)B1H0_Dp*)?7GXm);IYpl2p3WK*=S-N2plYw^(b%qqgT;=zfENn=B!FLweZ?D!h*(*-`MT)>CtnD>~?arhx2ZiP>+Ow*)#Ep#G|2i z_$K-=!B_*g)mJ~mOu#6~#pc@3-}!__!RD};g!pjjJ%&D{hQB6%NB^C_OOve{@TcP_ zGRoYo4H>CzedryxQmsaoWL-2b+`e8vOAyn1+6kNX$K~%;KgSrMHPlNkJ2LajYf($L zhyw6ug)SAN$ZGRlI+55?PMzyRQm0gOkyHUJtHb8JpIPG2C^tS8b#nPaSh!zNh-s7% ztCPtW4(C53!K&tS|8~DR*?yu$nTL!OpTTaU78v$v&)3;B1>jM*N1-3>ry86FZ@cST8+@MW=)}oKjXq|a;+1@_pqo&@xqKfM>iLL5qR?4`Xy(7u1b7qkM-IN08<6Kih zygZ?LwH#nZI@8kdbi|arXOj4ZsVx#hDocNmbO1LR=BwLrleJye@eTr))Mg5OheFQN z{DE%Vs9_?4E}s1137TOh$(lg(bphuZkYv@j1xW-WGD2(SB_ogIQj){(zN|1#_9F!Q zqR;C~F80Qn|kWzr_oTqHRb`YWg3LrLs^SX#$ zI(e84cf-9xbXZu)RNrU^s}~twXZ*_$b?bQPD|)Gh@x@?Bi?A|Uv2&j^;nuy%*4=Xk zqrfvPp*e+A(dAOv6mIb9^(!78_aJX~@50f`2ByhjI+P~!;AT0v7KuU0ye=m{)5_O# zS{X|#ZuVx)jxvu7M%NiFOM~LVh&@Ko+$Xm#c*T@acO8O1wrA0>Ir8~5Gwc7q;*YzY zOIO*CKdwA1{`j_R;Y0Dq#X!pJ{?9|7N5$=H8QTc~DD*r!R0_7I2cG9&`(r-nc@&0u z;Cb{8z8!cTy@k~Ov-9XgD$`9bdmfdsc@B9V?Z;2cc~rQe(hNT>=TTj#vi z(0ghtmwO!jkM#J`{Pex)1o&ww@~BwSffOtjdmK$E6f*oY$5CNw6h>)&`rjN!)jvcL z>JdcLll(nYkHJP-+BZz6>7hBB?7|>7Psib&Bkk$NJ^hke3^WVP;FRRBHF*>-UqvP({kggbSM2s z?qeBm?8H<-*vz3I8<&=i;d#U>N;RTk=Z%<2ig($IQn!MRa-eI@T5t7VD%*BwRJ)o~ zA*)r6bLFhq;5p=haEjW=Xmc{EPU_cjXa|-Fp6)030|lIp;$Wd{&vDu4%6ba&H}h7; z4mMqO40zFFfFiUOIz6-l6Dd#k8e38fu6#C+>?xDYQ})hFnAQ%Ahde!3P=C4Pn)p;6 z{IFbhTU93MpkR;0c%`L4UFsrlJ4P+4im2s3FXfMgI+stx#Q^i=!(0+?#~)$_t#FE8 z+p*a8gNU;-Q+0}}(c#oxYsOszdWvyH&BPZW>o1f_sS@CQ8fGWnDU&SR|1{yV;r^R1 z$f^dP*)m`qMFriLETr_Hx2P5J8(inL$!|0yGV8EDKFfyMK0maC27bDBTlUl*HV7<9h7n;S$ z*-~<^KmqJ!k^(kQd$YHRI;u_AWin7zmEC`qp9S~lDJ>S`vb~!H1VhB zGL-$rZ=*L}F3vA-3>MJPBE?^oEQ=+}*|1ieJ!Y5InZK-4y^@|0{U_Y6$A4*fc;+!) z-{DX&EaPNEB|7V2)v^N1j*7Ab@)_ZD(E~Kkj!Q3rBT!BpJSEPAM$D6(AQj845V0I5 z0*o<`92Lt?#yx7UtJv?_3vay>{U)fdsBfF6IlDo{N(H*R@sL=-xty?p(L82KVocMm z5?!w-r-~763AT4=J%Wj7j3h@$Xr`>$ueE1fO8w+17Hlp~60c`d=x&o2UqiCge zhzR)e@}HrXLF@zvB?l!(=$Fg_@7PZHob?X8GyJzB-}L@RHB0*6$JuXYR+pk-rUorz zPWXj_pH%Ae+Iq}O8zu2T`4G-Kr84vIsR#M)`v15?^v~YM0u<}d3!_5;TL51)qnC+w zI&hV#dOGH7nSymndvI#iGdCZL+sG4~uL3;h?xW!eegm|ejRLaaX8TncIwk#KSpuFU z?)<*RcWl}A`&%VC#_dD=k8e(NZc6k9Z=UAg*i!SPct&e0=Vy`CrcC3PA;P!>vmXfX0L*qQ=0y+hPmDD-w=`Z@DgRYQXmRhSgZK0)Kg{i*( z*@BNgdh-;&_wnx){(00Pq&SAu{|3q5{LF0I`A7v4`}$(ye*uZgF;2b+g%n8QrpS4S zKLF_$OBG0H#6?mMeV@J) z4VSO@zab%g?Um_7dVjh|kenCpnT=eC?U-d#<@bXw^rid4_c=?D0dCiqB z$l<#3P0rI1Hx~&WLdFy4^wGD2uZACdp-#$G# zxZV4eMY0)aHUJ=-GX6D_MOf5tv+AMSYJ7CsQjB@bw{9^o`V0@X{B z$24R*;B{U*s$VW@mR#riSn-)$`A%p5x|j^fRpSFUb8>a`&y{J>o6Y6OrITF*U8Ht@ zBtqZ5W1lJrT*kjJ|4w_lAW*}?7&wQ?~kuIf7m&%i*?@_%tt8;e0()=<%FFk#wO~ReeIa@dXJqUfKzks=Odv zRtW{f)03Y1<=V}xDv*Gb@Q41kRZ{P_GnEU`?)K12+v>fU529+2?&@oc6%rA1)qqwx zlbSBCTQ>~5zpYd%xIa^iP@C?1c(v6(l=-kJr~1|D>Wc?wnv1LizC#d`T?!?UJ8bpI!wmg5Om)W`QmN%LoPcWWWKqd!9~w>W!af z%a-9deJkFD@}lKU=AYQAK2md z0ulYE;rQVK&EMqw-tJD1sI3XUjjkS09-l+cu&dNO3orG2K_JQV_jtbdxq`rceou!K zc=84f%J&u)7UmTW<}d#Z9$YxMpnxBK`)|1RzVfC7{Qla|i_CL_*gltso$xjpJ;8*Z z?~9h#ad<4{Upcm~HT;{-GM`0ePx9{2-}yC9u6H368z#G;dsWHaP>FN9NNlWlw-aM0 zahq1doz6e@2~>)Drqk+cR8aM7{ABA7TOrvgkdbMI9{zd0LPmF2w_dgRL$Vx=I^^dkIF)^5x_x6kA$Ep=_yRSRw{=i8MbU%VX;b| zINa?c$~${fT;b6#i9Oj~-O|3|(aPrI^KbUyb{2!zKaxZlOcd7$}x{Kd{)m%8x7)SO)@9OPZtiy)m*ag5z#hmlzI zi3hP3+$v^2*sKN6ropdPx*gn+>U{OZ#?kx9vQ_H^Kv}w)hio-`5Rp?cnbeEc|E%V) z1LVXui=NaNM-{t?9z`w|%_5Old|0Ov3vs&JVE$=eWF@9iC5@H#{P|W3@(YQDCLG`n zb7BZfEfE#4x?z&8r{%J?r~R#Zi&|%T{|PDJdIy)j{?>PxjRrh*{o+_b8yKeM^C?yq z#%S&#lDHlsW1aEJ?u{@J*`Kw>7qCR|AAJlgA_o53^33&GgAc!Ek7E~7D#OLYecwp` z`p%STWRq|<+%Mku>&y?2MxOf@CRXW_$^lHnoV|USOhBiW0nFuJExnnJDC|bcB(_wW zFaME_7(@ZbHyI2&!DsrMoFN9LLgrU`&~`{Qik|{5)_cT~T|fXt{~I(QGYQ-;;tuLX zIs^X=sB}~!RXB~hrM?}Q#RIa2I&&_d;`5?~1ouRs;OnyXQa7!#`Z-XzBf`=I{`NlB z6`H^dO0dXFd;aer$+@U}uKKOX}VVIWjH;W6f z~~<)_hU;jeuEB@vyTWoXviuw`#&JC4Mf;$xj%v`XK7nzP=Vv0Ew%^vq3l9WQ08 zTgdZw$-`!%dFspvH&5m6u9{e(vz@O!k0$!YH;;9mlbqAtocP~^9hBOJntk>h0*W{f zkSAh(q@Q4A7pxjHsWY`UB&~6qcshe#y+y{~l}S|I-;BwAvGTk>u2gxo0=)GX8yzr^43d{TA9vrA$8?q0bOco zgwn>Jq01o)DcCAXDUAlz8*tkKl3Ybv89x6Os~FcYYuX&RO`Rf z!*J+hd=Yp)kH!Sm15`PeF<#1&7k_@-J~yPEnmDwPo9auOWT&Y{ZU?kNY$RMW&>OBw z{jJ+jT|pO9YVfx%Vo#@u@*6t4FXd4Z396W=m1k)t+XVGZpC~re!F;w*u2B79LN=^!$C#FRXg8LRA(}(*D1Yl3eHi0!CDI9>(4xFa9}4_!Ken~WoR#DojlwNx zC6Jg*yaKV$3@6oWCxK80MwM@VSy^& zO7h=UuZid-uoyz-q#oJ*rMG=6i=#egnResNpQZuVb}J{=Cdbj_PyVIJ%JM?A{H?R; zBjNJ=ZHh_1bZ%QL< z{+tv)2bkyUK=QMhaP-ngZMg)Vp9}_x3 zh?6$q$|WzgmE?DeyPy)`OIQx3Vp|3gVmD;q{AXP3D=Pc%SWYFYS9xXovfV`aHe!C2 z%`k@ycxj!`d_0;afH6M}#wXR$4(q{x$3*E#S6tb3M_>Dihc#5I{gjLug16RKnoy7?-sbr2u^ zBs0p}$smL9-!We#NlgsIJ1Xqr!zb@%@?AkbcOczokdyw`(Esi#o~PjP$$!Tg^w%Pu zzx4#3Gc$WzwzU$eg=~x_R#4TuY7miDEm)v?FEGoD<#XA>e`A`Zq`+0K zNWiv$;Mxf`3%C&UxBZ$--9MBXj&RBqz=hcwzT+Ya0QGdQlj=n6$O&jZza1=o%fFP9 zP4Vd(669R(>HdN(G<{JLZ!s>pNpq{p@2LKYtGgm{Eg_L5Fi6wXDy<)Pr1^zL$-dt)TT);`H1*2tW3n`CZcPzE#a5pr}JP z?-PYc^tX4*5k_w96Z?+A{`nTK1T(KCrg-z1#NI(GPEQpf-HxB!f*}TS=(cL_Y5XP=Za>w2#HzZhJ0`kxbc`_xXI-DLuvBgLv_L6^$) zMSnX-RTD9_NZ*4~rmiT|``-8!L{UN|t=PGlsc63t6;aSKY>F=s&feEE#-X1cO>Cc& zSJz-x=?7RQ?xb;gu`>M?sfygua9Dou5y$YtIcm-Ed`r2%v2`J6PLrbN|d^yco$e3|Ba#Wpw9HV2@XFt3V>Ij$sY zv-;NQ`-ZWZ8}7Gt5NK4qZXdFD*8*16l@oaSxYvDZqO0sC@oFzFf>bp|h{te7)#=1z zFkWI5NJxfWiO0|>@fa`_I%(oZ#A7gda#ip|9?8UGaFb8XO(q_Ln>;2rnZ1$ZyotMr z$FN%gloO9(;ez-uO!OyS;9Z0&-e&%w9~uG@=ByjC=NEP*kWl1D5MI`GadbHPY~7qn z#7~_Qgl&UBkXmnkMyj&lPH?=QJ0{mTMLeN?@W@PvW|iqQ{e z@1M9W|H&x@&By3{u@|1UK9G7+ z4jBk*R=?3n*1%m&!qDw&#xnArTHk~$*pd335E!LE5SX@3f)F+z z-@d%h`bP(OZvS1&8>_0et_c>!3R<3N;dk@L81bz7d;V`1iM&c5WtZ;?z8RV_;);bnJ+>9V_*#kVdyev+tNV(aS=qqKPB&pH0p#rbc)f z`L2s+o<Nps+T34%>CS+auC`NtKS!ld{^T|&dkS;v$*@eU+ zYzChvMUl+Jk8*6vaa87n_l`gSWX5R4s&CNYe1e3-EzD2HEd$<>p?OTfwYpx5t-t6} zBwg0muMh(kle)6iqgDt-VT4&n!bGvrOxCIMuMz4CQWYn9OIH+bx{J4-8^Y#m|1ERt zZR6|}FWkg^rl)5<8)k8ST%x3uHE`EhXUZRwOycEt2%T>A5r6A$chL` zyoMFm00+jq)$5l5p_Aex9z>AvH==H6kAuHvQYF6(Z6{jb&9a({lM%0~#>f|HD9auO zbD_`Zi46em8;=L()0SQ(QZRT4FiZv+XS+8}pK*I`!= z*vsga`b-PNF2RGR^&nVGOr4KM#=z^I!HVnjDpcRlB&G~y#3vFYA0c{7Ml zLRhF~I*<)=bP^rG#k`jy0ho+rsDiXgw8C(7hgR4Ne5r=emvUkADb*;Uk2O-JwEIPA zO0mh``rkZHDTMdASrklf!eGWu@GDiB33mP<ifX!e85-5$3}H6$OduGbj3%@2)W==d6AqT23ZJ$c?JD2??}3ZQI-lK zYO)-s(+YW44ml@5oRBnlZafB^r3 z{1fxyV*ESJEV_VRcX#t=(oVad?4Ie%i(QtQSu#@4BqxeAcs-z!6(USSaq{9K0Zj`wUZly+3hU<41uq(e%^Qg>N_?3J`ku2(>aBRI z1jFZ0E}fN-YoyB5Gw5~c9th6`q=!uVtJiu=uC5nijaV_V3Eo`eeAVL3eNz>0SRezs`&>t@jODf^x#zX%)F@lt zTs=Hp8euWW4kud7^Cg6bvSY<{%v4D!rTMLpDPuD%HzgmV1_^c`!!f&ljtmM-rc^IH zfO-pWW^+m#N*w#10HPcd*IKcT6-H|;2Ajwi^@DQ05%Zja%Vn2<;dD-aMf5hYrM3%} zi0aj}0wt>CcrmUBnWNYvXiuH{6FBK=w-at!E^L~+^iGm)&X)%&u7HJ~cJMk>5Ay^+Odk~Vn*Y1S^qowwUaV7K2{;Dk9hB}?OEAqwVCrUfaU&5;=pbohwSzh08w?z>1&19jRx(#K&80{ zNV(jFzx7(k3OOq#ifoR$^EdBiy7L4L;={yKhyS}zq@L(GLfE@t*j)LJOs0f171?BK zg_P#%3HD@IgX!HXqwppRQ&XvGR@JsyC(w z)Mw`|h~;!~nlU^o8gn7wtg%>h|2bJ8AP0r#VqOYTX9KQN&9h3ZcpRsjOuF|g81Qmi zPBfU&x}$ezQ&z1vQKN4X7dsFXa*mei0SUF!N=zlO~vr@6b5Od zW(rQzf}c*&uG)e~^%!Gu*fup!wEoqeB!C_{{h!Jdoo|i#wL}_UDQB&BiFC4%dgbcR9bLNK#+-VIz#T7i z)9#~4*1t19lQH5FjW4aFBG9IA+Sf-V09XXE!#`h*?C(cEK z4&SL6T>(j={;a;gd=q{DLMoRatEYn9v(#=`iNB{^@rN5dMHm~0% zi39Zgp@8}sEtEXD#&EZ}@zF-7jGACop0RzOWczLz3~JRawnL(&X_z4M!G|(7<{~~N zdf9-od(PHzYeNz9dD{<5_m(}PJ$0+)=)lYm-bAgQ=t8Zf$#j>q9!H?EoGO6yO_^I1 z_eK}>+^uViRn|oKgCoPK^NAZje4!GYo+CJj))m#8(~ffcw4&8~@C!yqmFhKP2~V#EZsQ0h z)E`JA>_EGf2oh}l@zDRvIHP;`seL2^e zx8`N}lh)8fB&BdWAU|tEo%~qcsIU+fR#*uK@!%xFl9=(oPLY*aR5GNP1B3|4QRXc+Qb^qeUObb_2i^1jH43dU z;kKOOT0{?`BTt<~vuaq3fF3o+{kzhcTIFd7-_J;W%F6lW_1uxHHB4T(-xFFxz>d9hb76)75_xnI)p0uAYzVO_=Ix)!3j+_}942;>a}Uj#HffAWr#M$G^-jx2&;=U)j@B*b!#U1o zGTM2YmY%oqlVtos#kq)SVHGx-x3T}#`D!xPk-)yt%b5feLu&S}o=z~Y>?vmJ4dBZl zvP~41J!ZNRA1{~3b_H1G)$E)rI#jY|+!b$c2#=#W_8$&T;&=wl)0Z&%OBHc?V)c$a zS!UU~5bEmK&dg`1#en@qzR7z3;k^g0cl*tJvUb3Fmvr;T75&z`<~6I82n?V%-4kc* z&oF=NUzT5ctI3sDAQ_I9Bdb_0hGVBJk-xHH*+2^bP)W}jx6jOLUzj(kueCES_CCt0 z`8RfkCHSx)!btzdiwR4bSLY_g-(xwJG~tu|jnB#4fEEygK&(sjAnyc@RLdn;VQvL; zP!i3lz`rrlmv}d?KHbFVsy(q*|Hhe;m@XFY!8$4RuCtyRC%)HyNuKi|a6$j@1okS+ zq5E5Bv4u3Emw6MTWx`5Qznl1{@K)~`_zUCq3j&{u9(t7GvW-QuG9=_(eTEBcCZvRT3&R?2sW zJ#6Qc6`^Gu9c7CO$==3sF$kXYHJ9uCq+oB#`|HHyg7}pV7<;Et~kai5g0e0SBy0$^8AP;Dprq4Dgv{IIkHI#*Iyw zPH?C^5&=1Cl;*rkWiu*CZ1pCVq01eA3Yq>gr1L?PiH9_ruYdsnhN&%!mWIu7#{&c; z*Yt^N7PSpTwD2IIxI{FboxgAa)OIP!>G^97%_0f@<5Kxq8=A|H_%B<+Z)55K{cTD; z8d}b~&S;`@aYLAq6mOdWM5t{tFcawaH7|^;?t6$`?{WEqD$pK{aakfqyE5rnS)y}! z*gQ4gqMJyqMBBJh zfT6(~hjc9Ai#)2mce^i*bPdO37vMN`=at4gsdlhiZGysBT!7T|?H4X*sZ|RuF>KE1 zm34Bb6RK})G6inUO6aj%{Ee~RGsZm|~g^R=H7%@5720njFO>@L622z-+W9>R8=OQ&7 z&Y+4uSb5r6by<9owayIGd8{!P;byqf*2}AZtJnmVYJuD~q3Gs?j1O zB=g65LsA-D<~(W%R}7%Nc(R>~4}~%772;vq&k^>ns>k2@HxfY+6@!&p6)av$!VxO2 zG=K2Ry_CvoaE;*UDRSLquA{4gO%KsVYS*vi{#PXRT&}>tZo1p1VvFUbepgc0*wmn# z8m~mNa?|273(x}ohGmtxXg9~JTBUG@t*6m3^ACX@#vtrT%g^;GeR< zyXnPq3Ig%R+vDDzTQ@DU8HD%IF15|1*pvlDn=01j2jX`n7le`vO3esvbCWZQ%+lMK z)W)LZ`M%T)1jN3oE`O`s@@*51XHV*qqSW<5%!7%ozO=pZInS#5xZa`7;-k(gQUZ&r zkNvHAjDx$uQh%FxHj{GTVGWz(_b}}f?gM2TrdJ%YRmvLGYsYd8_5#oQB?hISCM*#Q zI>q%SyP{s5leku$xD2LhbuDIRcz9H1_}wy{;i?`XV0pj{0!B~D{B30dTUZm>z_;&8 zZ{XwCv46k9YuNm5GMbdKWB*#eA}n6{xf54M8w|uIX=3amWcbmJw zZSKF=DF!z84pnXQ2*d_XR~IecP0K3_06W_zL64a zpMgx?Y{xQBr;%GN`2h7vHp)bWk~750OI#ucs=DOz?cDLY`k8}ZY`D}=XHK?BGOsqz zSeu}gHbs|0+!_3(YRZww18;GOZ?d%KpCN`(%~&F7vm2 zOt;PJC+?R4>Dq`71!(cXQx=3`LFnPuo$g(vzx743PTC0yi*G$o_huPzOxX%|2wxhP zCSXC^-!Eno+yTsW6QEeu(+0c8`dP9u)^>G#pPkA?c+2jG8%Rpw`%Zp1jqoG;p>Xc9 zA8z3{l6oZcD8J$W;!%BqTFH&NvNQD46RU`r3Zl7jzo{})78NovS>$#-Tpx|I9{zf~ zrFau$>P3*}Z~c(MsW~AIrOdFuRitRCIi>nq>c2xRVw!yQ?bij&OGc`nNA<386jHk@ zsHo>VsV=C1y>HIwC#GimCO*-AX>DlrJ`X*=X^iuGaM!si-6QjrQ36L_yOl>ohlaOW zk%Y$-%i5gnYpiQuAL^t(IKhldl5l=(R)P=Mo4BqE9ieRSr`!c|8`2XZM@edZ=qcKS zaMf{SYn1K2q#?py|89xo!rr2}G<6;#Sy9#q!2TDUDCxjMiC2(5sxUyst952_39bsQ zSi+I9)SDAXai@wJxZDo7=f?*x5+*_B*kuwT=1X4}a?;w$KI97f#zyPxq!i+8YKZw< zNGC<4#8g()giJabMWbM~s`$yRgsi1fy_I{F^Kk^3*dMr8PizStATGsUk)S_AJ3Y0H zNwMqMy7pB2Ip`RS?Jg?h?mBEProT*riiVA6AyX@&;K7^Loz4yh2a{29E8$=jG4H}n zFj#Qw0(ZkpZB1_guK&zu{9jGgB6K4{OR|)JeYM9jjOhCer%sU!;{~&)iZQ!O`hof2+Bpw&~<`u z!LMZTt;G2e2yJ0qh|}>Q=8sqCPQ@T&~7(mIzFxv9+NQ?5$1Bo2~KjA|{b z^N}t68TpDNpKja#KHqEf$?mxy{Yv-T&!|sCsg}R{=vT_$*?h_eevrclu9JKLI}Ugs zJKiHUeImH}!LQOhU~HM?AV0DtrLH3^pO}-U_JH;d%o94Go})K?XxkD#PPIsexH<<5 zy5vq^p!zocYQa=<-;CV-N_M6+iN&X>ytRg2|{_FH}y>S;Th7o^v3VRgj{ zU-gt#MgGUPCweM+##c|{eWv?dk)w-npn)1SlU7UICszDGCCr9e`)oPcnnO3b&I(%#3mFU`68C?|j|DB$^X0 z$l~Ah&wylr>2x0AW7MfUh`BEP+Arm~*EwhtOs(v{~tG zhF^&eqx-$iau%mpeU_UeZWb!%OY~wh@IA`P{a>s8z z&;=7jKGf70F`ensaXclv+s*^&l6moS9SP;DDByTX>FnZ>pbGa7NIK#XhEP0>Hrd*P z`nkz$fP-o>Zy%w2lz`r8NLNsgD*O=h-q9|Z2T7#AE|XGpzTi*`30*+&`~0F7xc3N%&8AE6^tKn| zoI*Q{g8-J@f8o{2Av)H9nPy{67T>T3Ckd3(^U~VT-SW0Rw1FS>)-CVgSOqyA;BgWj zJ6(B1xg>*va#|6&M5+1iwX!RNnI+~M^4Ke43A2XBst?EvnJgQOnJ#DMQu*c7UCghu zpDBWbY~ZJ^an0SK`)EhuEzs)n-yuRKcm1|J>b;w{(p7{*$-DJmt_!4La1HJBnJ4BII*t30VSG1tLwekm2iJ*PhEfqVhe+Nyi zI{{t(JFk&h{AwC2xi}mPrDn29+9N{{d5&P@%6H?r=9`&Z)4D%EroxR^`^hmh?;@0$4)`#`3U9`+-Msh_?^DnS-QB^z=o`KeSg+iN>#2VdW~W~}*9OeR4< z_W@Rb)ZOxEWg2Gh0y7BL)>cg!%Hx{5^|9sAkmMn>vRs#eHpT7Jrw(DSxL8}~=n#X6 zO~Y7_v_3~8lyISx;IbT1Cq#bFXT!nY`U>AEVAruuTe-BRCCpURm2it#pwLAV7^0U?h~PitX>VTB1<>b zYkg%SXe~+2=)b?n`muiaCO#1zlG^1Wfzqu06De60|j{y@=|@%8|~887M62ZkGn< zcrhLjyE1$!lbwt6yQ*c^pz@U?oPF8sJ(tULF)Om824ag?gOgdwl^l@DaVb~lO&&>7 zvG`CLLwb<)n;b=dD(VQ}F~heP?T+*K+hnHjm->|z=(*Z?JJZBcPJ%g7LbF;!AIi_#P_O)~4|yTX!hlF{6JbCk8Nig0F-Vf|B0hde zs+`oRI|5~es-wHV3zoQqO`?>q66{B8B0{mV@CWfH5wY~1BprsNNHS6!Q5>+G;q~aZ z4>83$pkTLQpp!bo4RUd6a~H2X#*xq-HurGN{q`t@r|dM{8wE6z$&ly_YM!w9xG2kH zjB~0og{NuZ2W{bQ@hb;*l-D;(c;CZit)m_V+$Sk0G) zVRnQt)tN;oUH15y#ZqB_G>uTjT;CGsebqSU;!NY$Y2y`c;~IKJkaWG)ntHpZ5WvgM zXm4MNrsR8GdH2M>w#e7sp)iYky;5g{X=O|U3!a;?g|Nd^=Ao2)m(n;lphycvxINm>oqlRo zXg)`tI&pqgA&g)xa-+EL(cHK|c|vvUWhBqVe-@k}Df8>h570uOASav<o2 zf8Ul@E~;E%T}ocpbAJgS1XlItR#KQPVVr3hbx3m+DNW|#LW>RVlBOY-GMKZ3G6*5) zvi8`nsn@m{(i4xrwUx?mFK9)2`X!#KVG3^Gw<*nRId=<>n&ytiJL0;+uE?vSSF?WS z26RQ*^LAqEu$HNn@%LdhTBerA-;NI9NoO{vhR#e4QLW*~+!}5#!1c#ymtSket2a6v z)KNV&{(cLpmE)Z)nbOO(^mczv`%z(XRI-)R-nLAMFKUVVa!Vw(4o&TENb`r|TRxt) zVsOjHmo*P>`S_Gr(d}L371cwC#clUX4DTB-7{>%e|j z-df@WgzhN^R2aRU8TjJ}g}^|O>z!9qNL<@<>H$?kR{kYc2XUGf(bs~jgj$qk<*pI) zZA7tQ^L^#)Ias1fQ{pVnX>S?rEj@U96F$2=^xLJqol6I_*D)CkG)Gou_a`i- z+3|3PfNg}40+yz~QO@wYVm@mp54~KhD z0j_(xG)#xemFEdbo7Hk(y))hYZ2|M0Fk_?E$Gv|nZZeYyCSk+)6| z5^XO&MW;nCKdo|t+;Qk@g@|AAeZ=|aa*RI&Ctg`1I5FAcpbUg6G~SIALLn{eh&<7G zu?(ZA;Q`sHBrv4=-y!lp)-7P`pI`N#RrOxf{Mkut{kx?8=hY-o90_FW|F`)$XeZS1 zz`x5c5>iL&zvi&&&&hv~`VWMU+?G3XJ8pK4I2`z7^MA)24tzBKE~)=PwLUx)d~))0 z-8c|F2liiNxX$wHivs49!|H!F|Es949(sN?|2nCEr|!mw>VHmt*5;x6FLH4wFctV* zgDvO4{v0^oZ2obF)ql-jA@!efSpCn*|8M$_uK~1;Ie&0dAxmA%4hAjkLU8p}xI`8&oHZ9*EhmL^@}>pQFhCqWrt+bYVdG1LyM*S>Ma0!E5jk zcHnsr~ldf3;upM z{nz~A<7Is)%aa4pgZ4iszuM;a&!2{W8oyo{H4wiFzhLpV@2bzn-%&Sx7XBU*KjsU5 z)u0b!zN^-VIo&%f{K}TUL)F6vluwUu!2CQU@Ebnlu;)kfKla99&ri(>)c?Gi5$1I0 zv**X=SMLJ-^QZfto*%gf>`z~=y4=psqNSfbKR3ocYkt!8XW{dr;O}CYke%F$3|vqD zF8_C4KOFdI{Vh`egYQcI{^LDx{pI98$bO&hPZ~aBxnb=OpReK?UFh$5(8r8SH5;Q@X`FQN&W50rXC7DIr$I5PaJaniPD&} zu7>8u4{YwR)?c>#h=I*Z`Sko`;ivRygRGBsgfxeSUpD`_e>)ubY5s~6ss9o^lpG3v zIr$I552X8_#;+*{;Ma*L#t44>?TXLFuWuZ6`1rL;@XPZU>*E@P42OnKHvhQ49u9mo zf2q`e3cgAYz5a6Yt6g<2JZG_A<|TS#Xlw`_79E>{4&fMLgF6H<;3P^^!D`?iVKfjy zJIkjrPd|9u?FWhf7xlHJ_w~=lKacFs!?^=GG<+35H2-6NIUM+E{>4)N^Lk#&h1bFO zi=6xe_w#!K`^6vBM=G|I!}U>)O&PTxVV~h622F)L!*9wd>!9OR{#Eoe%{T-PhaPV> z|MNQzXS|w!oz(xTo_`KC-kkgcH~fS4Uv!`y(RnrtI5;1=|JnS*53B#0zfR+JepF_bvC;veH#QMYk<1y~dBX~^4rDwiSRhF z*PF~wv5IIy>u2dxQlqr{9L6%E@Ry2Y3U%k7VtFD=N1RxWskNa19d%{Qt)(JkmceGn zE{uBrIjXETZNKAYZy3)Gus=uwMG^D2EmE16AXRAzp>Lrjal}PDv9alvxo=yrA4)n~`^ZCK}$P zm#UDbZXsOQP~)a+9K8*4r}%9|Y%;7fx@59^pxqPX0aX{es8wuH3k4sVt2ZaV9Qnb%Zdl+OgAXBv<({@27 z^wKVV$3>>EQ=Brm8c6?7sEI7T{Em}KBgj&T(+)RDZdp!iVvS(BRo_h>oG#&J0LxeqrsKI5VD*U=xzA9L&P z5F9kS$K>Ld&@dLdYy&K2*->Pn3yDlG^t#6Iq?esah#|{CZtKhC0x!fem)I}jrn5|z zys&!Z_2w4c1cebCvtS+-OZ{AmJxrskw@CXk%Ao9E!jzOW4KzN)BQLWeEfm)^L<`Is zufRquv;*C8064&)u3!F`nVXaU6v?mW&|OwTU#uU+Ks8;zBU&Bi_?#m9KyPbIkTuba zAC)aqZ!Ub?E`?p)!p~a+gxD|<7u>3RCeEcrqcnhro_x!Io`O0$8(Fd{VxD+R8j?_U5aZD}+ts#)<28GT z+4`Q+2YQEw`dx4J%0d&Xy;3mioPY8vx4EW8KCBH*W`^Y(Q|1!8{~4W`dG1RW$bIPg zIl1?tqG@K^E5uFJ5EHTO4ZMH%&(izQ{w7Z+yW8L!7fK%onmlz>0I?hr+fh5`I0k3l*XMbKb?uN5~0Cy3W3k&%eB|`DQIRHZ98T7%@j_CNXf@ z;bs_wz6==>TY_c*1MdJKJ!vmjYF{M!B{Gwzn4L?gqrv>~qI5%p)mNpo5|M^ZvGquJ znzz!HUZT>PsCD{8JG--fCdKoQIh!+$dRRI>I?K5q z0N~Bw%h6%xXKEHnFvb(~(Bpa$>_XQoD4|+vi&Nw4%(s6j^MdGt&^?2UZ-ZhP>K*wu zp0sr0!XFD3a$E0jZIh+b=t+Gk&}1HZPnD`Zcbaq&eZ$z*P3CT!Hae5ml)500!cSqH znRbi|l-LEb50L)Fms{%CGitp!zdJ7T_4r0}8`p|V#c!#_{P;Wu2LTf=y;JL@3N#_( zfrzPt$))4qu-F_}OU*9pe}CfB3WAPC*F^Sc27jycmh1Iqgjr)Tpd08KD(n^Lf7MLA+L#8S2ek z68sxup$7lP>7jc6##x~{|3*|jBxuGijhsQj8Xm&K-ZwuXGs|@e8UivT@mx^MXwruk z7Opt1nU+3sr{B|FRs|J{#GxPETaLz+=xWPblevO7V5bgW+viMgk4%?%6rT}1VWGx7 zm@;us|KJH1W|I2_PpHTw_Y0mdHWNI-pAMc-vP^2t1zuL|jr&nas)~D7`~i268gE1V zLP|{npN7=jqQ=x0ISrj|t!Pfj+WY%A&hTK~D4uleA{dI-8p0s9?OyeF>^_e6ZyZ+F z|1%*}y7FLK|IxO)`RH{_h+~LgI3HQx_4KwW#TavDSaf!Gm}F|Av1ZY=-#%7~%R?O67CHS@V!? zW5ubF^=#B%;tk*v0;E9JBOY?{iPC1iAelHEdlNhJ{ATQ7UY@&xbLd?L`AyU3;2Wc&EWVuu}!4qOQ1^Y(KJ( z8+nu}=6E%}IfQT#cHk2U|I$Q1Aalk3(7*q>;Edw#UsR(Ew zMZX81lQ=Akcty-fE^+>H4a(+1RVN5l9WPXM+~(JchHaMD5_x)pKTy44o1q-Rg%Hzc zeL_sre42GXb$7z%Gua}Gbv`551Cz{57N%-~Oy;wCGDr9r8`A*MG4pI8 z+)MmEy$*6$fzTiF9+47>qAyh=>f+w+nLGCP5q83r7Xt0PF7ZxQ41(nFLINYDUy(^W z#Bbw~T1kLPIKNN>Q;XGt#72n0t~Z%=DD|qpr=mn}{>`@#Z$5ZoVW3GPubDS5bazW; zq06~54~A}wa0;=W8t3bow;OxTNEMtbEO&fp*k%ayOi1+NJkZ&Y$#p}I&-s4lE$*~{ zm9QH%{}A{Eo6OC*ZKe92m{}Njgn#$(@9X?a&%KUM=szG4m(IkUPE7%GU|I)%OV@yG z^r<<%RK&+z*I8^z?;N%k$`a*<-JJ7{R+N76b{|82fuDXCkw@mcym-6wa=#blewP<- z_v;+V6#m&Nk>un$XLILAzS}BKJ>a|UYzRhRIAvRFYQ%A9*#l`jo4Kx`(VWC9_;og2 z4Y72vNhZhHN+X^~gR+?e}@ zjeX{yn0GR+BoB$W&GtWO$c&8#$4dnY=&S8-o?0P{jEJ+-vF^ZFJxD zZJmC09}xt*e<1aZQjcO2_tYmJ32mTO`Xv1-H@kl9!fn;D;=R$4%yDm{x&IZdxO<)? zFbFLVG|N)M0Om84g7h9)kHYeF;u%OC!mQ%6aZcLvn^Ye!LCp*Ht|m&MU*3);JQl=c z1sBRwPaI%xinZx>2_$}t_vlnvYI#xo%c&=i=eDxt*1@%jr#`8PUyb*&rvbxz08j%w zh~TYxd`oqO2aU3)60hfPo4!_ERbXLI_2i1TghCDDOwGTN*cd%!(63VdmGDpPOnS;P zm0_W?jjyaiPtOsgmgat;>CQqLAp2qFO^uQn*tcaEJ8CaZjR%X6+lF695-kZOtCs@_0bM3$LRhfJ? zl=jMVfO~nv)`HW*5XXr5NugSOP0#;eYr(nfaH%grjeUF~^ySXx*{QzN=EQ6Hi50Cu zPizW2-IVt5Yl(deZz|hbFhBJo`8MzKZY{V44+^(`eRMBpW!C_a&sEqr-+}sAY8QR@2gwm!%kPve0ZOuCo(AHT zZR;2&N`vhjGs7(!AJJr%(h_no#?&tM zr`>=$h??at@rvDvKSJG~R%iQU8&7i#uXi&LrIZSDoO9`JD!UaNA4uT|rMS<=;&Hox#8K9+eut z4lGMy@4z0;u2A(Ni+7rYnu9vO&mOMpG!3oip1Vh~XJ2*yxHl)w@|#C`;Wyzr*bGva z$&`t=&418CQ~e+6dUYn;p~Suc{3Q(yQEvCT3IYw`Z3XCqd(4ISl5&iEHVULh^U=#- z3=*u6xVjZXNBWvA2vx)V3aDlr-B%q2#ONTc)=Y^T(zF@1d*sS z-@I2T9kcdZ&Ss({yM7n zsxQfs55<2f@hj_UW1!s1oLc7B<)8RIQoj$=2om1z6JN~au<|wa$jDLi2sO>i_4DB4Why$y%j^*5MDqv^G(ib z77uhHM&^i_{gQAN#kPnQcoRD~h9`g+;#;|ODc2kUx!jv4%igZVmt^59Vno z)P-Gj$!YUb(@KHk^^23YF6n!b5?O?iC8v&31F5-S>?LxX1Qc3pGH+h2)LFq6=`5F- zg?%CLdDwJp6OaTgCC*@$r3Y4D=Dz*72c8Mq67_LmY2#*7(3E&BZ_-X@E%m_f%C1%n zI~Ab0zP{0yW~4!CzbJe1lxu7Kcih8MYW6Hn`0))uD?$vqB1RTS^~O)wb77g-xyHtE zN4ah0{9`GTymoG~d9fQO0)Ca!@DM?d&5Yn7ow@A5%wovfWbWvsK^?v~K_H^z@Yit! ztK}4$rrpxm4CKN+<4CEd$>XV|XKeb@$s#g7o=?Z{35x^|{Tk4rKar~QBane)H%}w5 z$tcbT)=kgi}!o{DDtO23@>9YiT@kx>w_lh?z zBHa=|eEnttT=U%I!o`WrM<-{`SL12dTUUC$&-_I2YcA3LXfG^?B>gjUw26w;_6C-7 z5Cgr1i~C--%W71Ftffp1M+T3sfu0kMr+$5jg?~K&29Xc{!ACAdEEb;#yDYL2?+tTSc~=MZ2F}uDqiW7 z(*e7j3b@#LwF?SbkgCP6;~U>Wf$`LwuS3lyz9zWBkqnUhBEF^T)`r7^@J20twMWpvMb>yK92@qO@k8Hf=;x>Q;5)If~|#muN19l8n~3A_@Am zszlv*esH&bhXTEpzWvZj(+!4l8vHB7SUy4mR30u%zc!c(hnO8StlDQ^N*GieE8K}v zjKnhz63=*ovmi6pX^!xb>;l*RUK&+3EpRhFpYly%JzknGxc%AIJQbt@pRUk^qCGVh zpGT)6rGhy#7cxYV-ku{7p?MMY z8eIJ8$pWMT{$Ne;u6&U=2S&XQD+oKqCR7B;340U!#&GXK*n_XC_iCTI|4r;GwuwJq zqr0glN~U8uLW8dQp6O1S9~c!jZ{XomCp=zYDYxvGI5lj{ zDw(^v$EIPAnl2vWUZ~*A{e6uB*XO@21&gYBS8Q|EK~^kgUrjV5_Wzf4GOgLRlgNBs zre71eUmMyN^|kF-aYCvO`Am{J!)B5+-wSH~`gAdeUSBD_FHZF2-TD`SSzG74*ics6 z-F&435p$zv;C!Kj%SdG;uTb;>{3VuYgU#aCb!*Svu9e?SJRu&?z1^K}usE5J#O7tn z{f6JChxBj$72!iCO} z6zwL46leNX$YC<&)g}H~(EIq7|2`|tM#S3+0mxq1stkY3$o2ecfQZvIgdF(&jKHVZr>V+(U?DRh;_?woNR!DU@ z@6tZ~PwR(zIkW^JBxCi`*F6Ge@uO60)$!JZGcDNnOLO0emU3Hz4uQQ0LA%=`h^VV- zAK$X{DZO7X#v{=GWysPaa4k7AXt~+sY#uTN()nR6@AtZ1F&B2-U(|pW@$6Z3ruv(# zsO^HQJ$Z;ib`bg%!ZHem!feKtOdu>i_C9XjxoDnC!549ZnQ5V8IzTdSeK5$Ay&tI& zN*R`x!`z3=ENV(MdlP+Q;#G;wA0_q{+&lpaANE2bN|qumTFQfH0+qspoRH`o+Eb|% z5HQprx_XqF6I-TtCH4+q@y`^2)x2aaAutN1L~lsrwkJA$w+CAGT^75bW#1{WsV(~^ z#-^+piGxrCgvj33jI_TklTVGGVpCi8RjfEx?h{+~O<6TIleThKk8f*U1!e4Ct#xbO zWm~7^c|=6sbFS1qgjW1*5%x5Bc)T{R!Tad7LVakey4VG~k6k(v!Ft`3z^cDIz z4v&d9`X7g5@;}ZMQoFCEeeFfNo0rJ9O8ItXySJsi^?d!-E8jYoR6Vug zqUJGaLhr(L$@>#f%g|4;<2MuRFtXSPJ(05* zT9y7*2pT7d`48q$u7gm@wcKYVwggp75H_I>3WTr zkI)y4nCmvnh6{t$5556Cxr=*c#OOQJ|Fi6foz~eLBPeaCGqJC;u31=evmmk5I8Uf) zrCi!vnVJzy#vPd5L9xN@w-o6W9l3n$u;um=i(Est&6w|Jj(RGaCO zy^^eQKSl4{ta7608M1N~S$#aF_QOGx*2_iED_@gwd#ko{{$b6qb(hk!V&@@_qwYaD zIVDQW9$%Ab@6e;N6}gFWM6q*!I@`7xdZLKtCo9Ok)fX{~GPxCiBH*y+>BxJ^PZk3s zIfBt2kGbMi7$g>2Y7RQhyChUa5D$S5sQgYg7>Uy@s+mQLk~Y>7oT0CaY`%IJ+9vaU znM|+1Pt^YyHYXoQ7=hgF>`87xQ~4!>8m{3!)n>(3K?0Nfubx z1tLTU8Zc^ zS^_~X^@i436svgciK`WBjlo-fpPBRSW)p(-`9FVscFCUWoH=vm%$YMYCx;s*Jrhvj z2&wRbd&DDJBo%7SE~OwSje}YMq1rtm=1JLI$&nmUUn>(Fft!^@(zR+DI2B~}ty<&C zg80H7^oN;}(BJ*)U@k;emI7XgP!Ad;o*(+Gr@O0BcNN&@FWP+C6L$02<=2M^NZ$@;h%=ump zl{qymw0W}7_J}StkQjv50E^pQKSe224xj^3$=GvK^l&j8YdAEGN}SC#TTWdJ>UdFQ z%a$nXy{j<+S0esS^_PW zJ*(J!)eO-=k}Z&4ZB@K-9=fU`(;=y$Qq&4HAwidD+dYZTlN0dM7;cH;5a}Fk!#@}a zi=ET3x0RN$5vdK*Mj@&j^B~QT&Q;Y1{&mk%LH27hVk>=F(MxK~wATfHmK+PBBX!I| zi_$KFf#S&DB(Y1AV%YlTF)7+S%)*c_WkEJ&#ZbnJQSDq&iL$CuFVq~Z%XRxKRp1y- zOCk)Ng_UG{;e~EB?IKbR)N&`i9JSXOJO=Q(`E;ENd7J77+2(^L*S2Rv{7}(e%%sMi z#yLbJZ)=%*)KMLzKvV$4ds%yQt5H>Ed@9dR^7?9=JGg~`_`=!og@y5jGvW)+h%Y=h zzHn}Qp{Rod&V@lUyiy{)A|6IZIcH}`>^C!fB=#{|1y(|n39XfX9yv9^a}2yEa5_Bv ztb+KQ;zW2X;L<{vUFc{J`c7?a-mHwk>rxV&8cL0@q*IDl3ct#U0PnoAh}4Ai^g7@ zDqU=o%OtsM--1+fiA^3W$z%6^H%FCf~`r50i*dk*ffww@Koh5{cK2kCAK{Py`T6MJ%(u)Ltg1}=ke+$|kTkTi0_!I?G9DOlj4$bHe7F7X=|YWO%d8$D{*B=3gffY?0F-O4=v-wucV1Ya3}_6x#o+e~97<2PtK)Q>NLZHe-62qR;Ja`?$g4jb3PRR)Og-`OH! z&)&h@$j2+s4aJ_sXc_K*5M0ElZ2rKrq;^^&SHm<*W7iaAHS{$}#79C0DZTz@zGMX-iz zQ>tuwzmWYv0zz>(UDTS$4{_?DOV%O@?qlsc>1 z7y5tLL;uBqQ}%!ytQj2kfLl`+o;2Pq-`ZOomCkqJA#5I(?;?4Xi{+e!=%}FiX`~CH zVFFPgf&KoCOG%X<0@g`gP<7MH*&(OepOtEVYQ~Uxk#$N&2Z!1YPV?}-S!NGcW(>S% z7d^*k@98i8eQNxAK0^aX6R2DAViU#JCC5a+#|Q?-v*k%^4~dbziL8Z+y8CdQNzazG zm(0YkR|~znCDs0c^XcoF&qY|YcAHNh{yoyOoljpE=F&YL*q-=Ix%A=h*&bmSKVOn= zFVIVS_P$?)SY)I{O>iA#(1IY=ssD+&9HOB_@LoWW#1Bb|FZJ2d7(AJ0wTutd>#K=j zi?*MpT&?Ty3)J1=oq@tVvCIQCABKMe5_f9!eysYij{{aAnPnLhnjX3RqnGw3&>W$k z2WK=lK+J@*-PR^#4%^a$sO172P;|0hUY0SVJ?TZf%sg#FH>c*aXTDu8LpgTZi{QI| zjJ*W=(Sw3KRu=I&Y|2%CMvLvu_Tx`%F5z!jwFnel@MLLEE3W@Cle|*-9wdfVp;c@# zPy#*6Jps>igw2^0N8N`>8aw{S^`nt@IV77(NzTH0_;>%*o}f_mSonCwn{rbrE)o1I zN?e!zxjfAanoj$Klq}ow%?*QB?_4pkDlxFid`dc-h4@iq>MmqPTzk`yzv*^(99}*_ z^Qg3fg|M`;&41G>(pR^ysILhp>WRN#CO6`z##oEZdMSvmlF0GfXL@8qjLdNCe(;$6H^-uw}?Kl3L-#;7h{AO6JEa4A?DL zG=CwHU&V$%;O(~FYZ8a?{BK|Bh`m7I?O4fGM12kiWfD4THQZ->i6?p#EZIA*U9Rqv zyp-9=+4xPyfgL72ZKoH2&q_|@9;gU?NI~;iodh0jNtej|BspkYdvXB1-Iq?}^1I!C z>lT!rHqNjq{xebrCl}rdkBkl1*2JS;b8ds6Uc}WSom^1lM82g4epet)R&4x|_pJZ= zsO&t23#=MfFZ?6pYs@(5$22bk6`t}>>PNfw_=4LSa}=2%3w>$|S)Z(UhZedmT|rk0 zUt#up)$>IT7ecw=e7Td__p-p|#k8`;|HIAkJkCO!TW$Dkg>pL2mGw7wJR+s6#_wrs z|Gt_xFZ@lv0cAAG<6}@uQ4~jb|7x+I6Ot;#T64^&PiAqTj~pS+1>?Cc3u3_*YbD<5 zgk{1f3Kygz`-*Ew{a}5-EYntJACJ3-(5>utq`2U)kL|sk5_{_2g~ag~hf@-(0pNrb4s*%}*X-d{~Ea5M-aA-D6clCi(`^ zj)|MQyiHKRJ$2X+w+c*&3^|mA=qaBnW~rCb0z@RbFz_777dx+ITm=7 zQ7JSp&=&M#h6?}~97e?8+=rLlZ$!_n3Xinsw1B3eNMKhk00Xe!+@Kxn&WsimNX5t0 zOVAQ7KF5K1F^GCf3l)e#lq_(okFG-#{eORF0U#_%fQ93nk?FOw%n{iV!pz1IG3>0D z^^{|_;*%2FTC9VllQd*vlLu&Y_9$cmKr74c;lhW=4_qPvB?x?sK>pcl334wiA( zo58OlqeA9HX$Kix7~tlH0K1uw$lQ-zBXg17%Us<%2E`wQvB~%`q~ZKnNMbqxez^a9 zNM|mkzmBq#v8INtklBW$Cxy&Y*YY>IGwCJ0dw^w($%5Yor*ap^>1n(e0N%V@S`$Vz z$$22%(=_erD%%r9`_`ED(`6Zmm`_0IN%X)E7lv3pzB0K)2yz`zWzZS_rPu!v03}g} zMhL%tX}<953biir!l+$7uhgDVnLmNt&L^1je){r=ovYpu8}ZoY&iHK08+98^SE86_ z_0DK6(hpU=NL3Zy#Ob_bUuDj}KnCIKvR#!*UG3XI7wO;Qc21h@@&9}?TS&TbTVC!{ zwtlX#_!6=L?b_po;~FgWSUN+W2R}o<&&N8$y0?- zPM9wfl^&BI34ZaXCxwD^is2V6X+STpTMVF=JfKwP@{3foCYSN`la=2QgG+Zxxbe@= zRwkL^e}Yf(4=O~g@U$(2NoHab{CBfw#(ef`^QRtIUv9J0_RcpQnBT4c*HDo3=wIt& z3a#+{9(7}neD(;15%LQra;jo2ETk~q96(97UTVB@Y0LjEA|CdcmsL7BBIyNj}JE zEI&xW^8lJ{X)m_f!ndB$sXaEqWn}-D-);XOz>}F1Wf`#+JmsI(A7S^88gsfN%HijM zU9yZsX`wsEr*imF)hmY|)}-1`yZlo2i)^WPz<%+0L>lSZFW?&pfMQjFZuNRF;5?w) zg(Lb=*6w}kZ0G9V6XSHh_?NUS`-R*zqGg{zd;5`X6yq z5S<@8&VLm?PtuG2vXZJT4AEDE z|8&X6*CVrc$;V%$$!?iGj00?MAgHJ1<9pPz=Ii9+9QGv<5bJ6Lj+A_yT3?GZaQovc zWY7oVcD9xoWN{nQLS7uYa`DK9(2fn6v+8t+laPWVhdUK%vboktSh6`DkRco0I4eD} z>mpCy{;RK>fzQ=l&k6;u$fOhS3nJl!%>WKsspVlOfDkt!^DEtuWC8|a-$(ll#~vM^ z62$qJVBms_<28$zWtr!GM4q_l2|Jl`{y5xu zCOw&#J8LXv3hXey<_K~cd!sNV&Y&V!{DMbn8C3@8+M_Tq5Tf>^ndcGIv`S4~=Mjbf z8F;@S;>d%+k5-7YG~%~?0|6cd8!uS>K`1&PY);S!VCvMD_=J(=FI)hY=Zl`UBeHT- z1l#$%2rsS{MMpg*c5BJukDVz040%j$Uy?rSxYy^gdHh1bn85Ss{mo)ro7YDMhg)D? zq==>>ep_c(8mu z$zx`CK#^`7H{Bi=65`XrbX)@ybsO#B97D~n@(e|S9`z{MEx-7GVB1Pp?y^7O(Vd&x2;N%zrLNS#L|`wV=w zOg=x+M^%b)6BIL3N+_04dnd$O>7hm};vc(Ani7ln4GU{bJ--q&JKhBuFNEow=22Xq;Q{-co67xOfuVYg${!=s_ zIU&9zkeDgVb@!z@B+~NTLpL}m->!?1f6|L_J;Xs>uAsW2(kMM=bMqNFg0E;fRAz%= zD3i$JLQXu&F1|%-7PLZ=&N|uFG#5iqF8Zs?Y&Ta3psT$>(w;={P=YOZkWJ1d=z9?_ zQv%?|9YTvkcXZkFHkE7@!m zzQ}JZ>EsY6NyW(#{Bq<7mbles5@3o9Nt)a2kvG!+CNpPygFI;Yq3!9Gm9p&@TvE>u z%J)R1EN5e3wTbDyu3mOu$Igc`J=gz{wq)bLh*AVxd^j$Y?hs5a$DG+oYL9`H79riTiA15%; z0Ew~_lE^cC_(@^d?lE+NtsA?IhSqrXVK*aEs8KZTbabT=MdL^FU8v?OQKkHmg+FU_ z5l>t35zNyJmb*>EC~yg}P3gwvDMvtxtqp>OKC|-xuq>AOkAQTNhTT)BxZ)^$REGvdZOK4CcIG7cw##a1^_`qV1xo|;z znnw-Fh{{T20qJ-9X>8LHGlpCQ0sw0z#F~Vn^rG`eQ+Vn%#44Lsi#8TVtXkPoy5&9icjoDtkSx`K0x{! z6gD1#JCFE?wqfkNt2~Un+9WZ8(M#9Z=be!{ajk@K@)XIKbl1-l^KuV1PPrt>alkA5 z>@+2>tOp1IQfnstQ8_ZaZj7))G^AJtaVl~xgQACP6G1T*|NR9iZg+3SN`+~%hQslG z<~6l)71ef+WtW~(nnw@Fm-v`?k(jwAGQ+rw37U_hg0pmFEnB7c^0!I(&EL5EGS2Kl zbIUg_KMQ1I&(Ldm?9G7*nN(tK6WGBH!c~#axmzkOUn&D3m@xlQR`)+UW-QxhQ!(h# zhvb4klG5MKDDCRcgcs8^U)!gt35N8R>WJNn_jOSYAb)kMstEhK{+1#~1kEeo>w-@E z)BT7x-%#M^^A;FnnUXgI|B$pqmD;TN{q+s1-tzC({QJIpu==ZPJ}2Ye+kb<@bmul58l7#-*^7O;9F($502kkb^Hgd zf4Al*4hsJ&%^!2n`sdsHgZ6*R=bwZB`3J3kh35A^X#eMH{)mIs*9Y^Q_20`4m`k)w z%3dZ#U!%1CeFuZj(FgI$x@XJ!O4Wb+gU;{Wnx7;FK(F;P;ny-f z;XhyNKXuUYEBvo^2QLGDrT&Dm z_gY_HKzsk-@OSlp;{u_9p5xd4iw+KdSO2qmt*`yRs;Eh`PZ>WV_bI=ZEtpfPXnE{y z3wC7^I*6w_<)Tt{$<142^UZjx#NA&q{9R`dZ%FpjJB5>MR@M4}`{{w@FS%RF-|~&i z4_hzg&;Q2dXZ=vhpZJZ-Pk2Q*arQyVyX##ata0|rt1`oS#kW4|@x_7oKCu36T&Ev6 z-&(&+o9;GWsrvHZj1%~b{%_M~etOc2J{Ys2m;N~s{C$k*uw}|q<{qM6b+pRqR1qEP zp!0+%G&E3ZH_qIz?ZawCy|i!lYp1b7*3+6k0rP3E~@wWNOEso#tBdxn0O==T>>rOea%eXo8m*Y67bF4ON06y>c!=WWrKU+66Tjz3_E zjuWO8*eE|*iI4v9Px1p>z}cVqw}sC(K2P&`fzNI}ukm@C&ptly@oDGt1)m)1c=-(E zQ^039pJF~o@hRhT5}%2DrtH3G(?F zpAetl@_B&I20oAT5qNukmXN0W7uopk9hd>f2grBp-7hjw_;}vNd`^-CkGL+RN2XXy ze(F2`o39u9npj7Eeg9@pMYHG0T~amHvOlQRgC?YvL}js2+%C*f58HS=&9m_+&s&y{ zL!ayfaZgFAzkCj=lGI$l8*Jv3dD1EOA)S$b(R0SGVcUD@k2!>QjNqML*~z8JvOfHq zJi={@crBjDh-Le*p6aBLNhv;9<^ChC>D~Y}J72YtR*i$*c5(b$1&SY5%n8mnV^@%;#nLHeb0zh<5 z8ltGDe+QA+m*>YiJEOCm`_fPqnj^38QsNw`u>dW+)6{*61OAKaWL)lrw1B+5QZ1H~ z$6+t*!M69vSZ98{uX+5+=JB7%^dt)uqUP{^@VjBIVkNP!z0#9|zuX)j@q54x44t7* ztTwf8>ubE+mRI_s{q)MA?OM4~tMtH~##3kt0mS;Z0y#Gf2muxG$mll-HH&{|bLAIkEJi2ts9dC#CH~*VwoY^C zi)wR@{X4d;kT_Y<=X5AMHZ1oAuh%N5i?;WXanNE`*F~30A_AYhtbjV{qh(oHYb#6J zclkH8#P*8oT5LyPv(andG(m~{kB7-TxlP=N{TMAWvehj@UA}N+vbZ95RJ-VF7_%NN zE*8Y?q+n0-OG(E$GI9=D-)fEjV~cXz@lqm>flieA8`JfVS)a(mQ~43Cenq-Ev9YS8 z_RZ#)wfY23*lif=-XG1eo*Std`k zx)HG;)_(E%31aJvqCzmGPo6L{;j0fiGcq5s<@2&4;z%K#dvJl~Pfr{7@12U1E@6iL zH!jbC^>u;d>i_@X`ePPwliZFyzE_AP+Sj$-KD!lvzE8hk3Xg01B4v5wZ<@%K9O6lq z#bNX0JF@;@#QvK`lL}Pa3*#sFE1Ic=y!bzCmL^z`2w?%N5l(>-6|z4iX5u$*Ueae> z<*saUNc3Ju-6BtN*jkg_T5>b~yz$-qW#^HdxWLCc7DrE9y{F+gb4{F!LR8xetWD2* z2+Oi~)!Jv|8_E}e2a^{9t~vh)K+e;`O8eG*556=-9RdrITjbX7Oo8%_e_JTU?s>TL z$8`AtTHfcD{{d7|z-%#Dho*q{HwnuD`Mx%s$~v9L({(S@y1Q-^`Y&iZUovk>XXa?; zAKlCuWOhxD8xP?}zx$u_6GJ5%G|m6&eSVHq{`f!Ur((sy<|i*TM0bAP<$#fzpMGvF zJ3ourmwL?4%Zw~zett{c^!(Jn-eZ2=Nu#B2-BRY~PIVN_oS$oX7FBPibbi{?VP;xYLh@07CeuT1!#}2Va`Yq6@|1Io< zb?6H@O}YKidcU%tDS_&Ro{F8ps{0oD%W<0MpCLZFTFF9PY~&>v{tuZ8&#{Id=e{Ng z5}T4y)|AZBZmMp*t*bX-tu+##__{Mw%(qtdj~e2Cks{Y|ii1djXhsW(xj_6`+(Svk z7btNx2O~Tu#FgeWS&)b5ySI{s#|Z1uHp;ErADr{19d zM&cQZS?~jEX8-i5)4QkPa2(ZRQy$G~_BgdV60P`i;G>lr`{oD6ny2mcQv~{-_b(d2e{Fw{d?t ze-%c&O*{Ro9^4Dr_YG*r6&Pym=H*hsv6CtKsqb@>lH zNe~1zb*ic20UO6Y900UlcWh589nSHT@At1OlnyHc5*L26zgbKx2z=$dz`xA};(u@F zqdHz0Fpn)`Mmi|$$R&DiOKywK75*h;AXwrJW&BOgktc5sZ0FwumO_=@=7Q$kuvYQX z*+vK*P4uM`Yt4g_C>9%Hgabx%nR(b$8sQ%=*WWV3OT;>aNbd~5z7!nytZn{Iw!%?m zh6{i^`GR!mxkdhA*0fVbZFWKf9lBH5fHt!T{^)*h) z;_i1dvAWvOcXT@cNa2Ck!Y*VjtP+nsG1e28M6S%7Kc@>^p#{!M6_8w)3^xkaOy#dL z?HP6nlA221<{x=t;#K~Y*GCQi@|*2QEm?-zVFA5WdAB=P)_Ksbi`Mh%7-&`xccx0x|9= z^4~N@I`|2&@D`dk;kiTJ4!fsBes|I9mRQRmuIiKY1ioaY98N7BYnh=IdqvbFT&(8~ zF<4;E>P`qcB`^ut%e^CEu$3O5Kch;bg?1hiRBA8fYJN6Id7plSTMbLp`lJDfhf926 zObtXeNe&m$<92L$622b`y?|&@D(2|j9?RXo`Wg`!E=iBOKOy_xz8osUZ6*=M4_CS# z%TetQrwb~u>Ju-xvjSXMB9~q}OA-kiBVnza%Q9NYGe4shk;gita@|aH9yJ}~n%-3u;Mt2%Jc7LZm&!^9i>Lpk6@jtN9 z{?DtUIp#CAxkwEK_laapUDEW%mC!gjaeOI)UFu2;f2^SdJ94vcrrN((mZ*mwgCH&k zLPC7HV$km9Jtt5U99X(_mVcfR%MbMyV;^ zJ_QuFwiP>9omn6lT{u70S;$;}q{_i0rF^Re&5EB28!J+eKBcrt*Fs%Rv-pdr*54Z z{_b;vEUcjE_<_{HzrD0IH9jV&@%N&#D6{Qt?<3vNwe@lnOxXW~cJP;TLl7&rssjCk zf%YwdNdEQ;tP|3y|~GBB=v(iMe~A>t1+X=!1!AMt6g zDJ0%2?-3Fj#m$&kWHXB5%Zs9eP=!sprr6C|UTm|9Kd=S&T)+|c3#1k z@#VhuEgpfSK!7Lg0}G37Yv80SN+O48zw=6XCF*p+T~N)G*lLJhjyFx(S2{IT`Bz35 zn;noH)zj7qZ_do*?~Us!(E)cQQeN#JMD%qePqvv~zjwfWftzQ(_?u*PEkI2-FSROd zy8OYGHLHlk!c=E;Mz>aZqH*$I@c^m@h(Yi(;7S&65*W!ArH5vpEZMOZ4<+6| zjJ;dLfk;RiuHr;w3TfPd3bbq)1JuSwP$BfJ|{amFt#}-wk4-&PxNhk`}>U88GE@Clg9~(=e}Va zR#B?**c8%I^ry+8SZje*OnERQGd0wykgyzU!`+jt#cnt z&Hay-(ij1KtIVC+*!Zr-x|Xv3W#{WhKau-`k2p$59OzL9R6?snnUtq)eURzNyI3_$ zBrngbxI8%_F{iLDtETgLXS3kG!zp4;!=|xLgasTDU?$#3B@5IiFIaL2DXh^Di%`UD9gLuLc5 zLS^C%BMBK}RQV@l{zNEAA;T7KJNBd+bXLh!!Li68;3Zu%q|9p~Rr**CVWZ#eNSc@8!x(H8+BGRVJS z4q+v-tK5X>hl}Fl^k8;i1Q*x7J`u&$Ae`B6;#<}IhL+s3po+=ma3VC=4)qfoUmqB=8D4uP8E`JMaL^YkVx1NDKH(TtJ<+T=& zH$aZL>VKNZ>fGxzvGFQ(Shb1))Zp6p{qW! z>*^Qq(nroDg1dF^8Gyw!$4rHyb8jZOiT`%@^1>RvrhMDybeVy`wnX>e3O~z(4gY~$ zZY5`Tzy7iE9QpL?6T51(#&IkQVNY?wo`P4T-+0D~X#2_f?){DF{yU?;mfrePdJGVZ zA+bO4N_14+3XA;f!JA$qg1pn!Gq7Nh>l$h%^@T^+B~OqXU30=O>|b*ANS#A$orShi ztf3VBk$A~9o>~zVGxGu-bwV^>!tEq$F^Qk;Rcx&+C*q(QGtu2GR?bvML(45LO~Lc1 zFhh;xR}gmQ(sQ-BSe31wpp7o#F&C>h3Rcq!bAq70So7|J4C$X2mIn!5@2oMu|BLRT^6UW*$Ph}BwaI=u7MhqF zyRI-Ra!l+xUOGHNjE8rr)h{C4{eVH?P@qN(ial;+=T3UG$QF*38r-Yj6OdAnYoJ3r z{7X_L{!EEl6IqR%o(iV2OnsqB+~HU~1_QMkvA@R!K*xE()}Z;;Law+nm8*$sC5+xqUbD-NwUo$ww#`HIN)dVY ze2F#~XcN&am2b}rH+&y?NTvw#SlyWtha#Tl2%Hve6RikRxXC~S+^>_$-51Ym*$@I= zl)%$b8%bySDjosQ%|oXM*a3+ZTTpAWzC+?tck#4$X^8LNRTCB6(4d zhnjBEX(`FracupUZs}J4=!4b&_d)9asC)f?-9Y~+jKOjSE`g{}FL!t`2??pnWa+@I zU3?mUve}!;?(N;yTYC~_se5}5D0IEG*S@~n_-09az2Rr7Lew2U-#+;H)kmJp;J;8x zGBtu$P_FiXj?FVuo>cihjd4vkL!npJ38|F#*s^9bp}xRax~QULqxd$PQ-Htgy^gt5 zx=_i>kwAMs{3ee)DYZyWhAAA)FMVB5o*te&Sf3s)lIJT*B-rV1h`6pkl>1JUN+tME zKE-UEE1+{x_q6G_St66oQ$T7>zj3TKgE#b{1Sl?L#GG_5fr0#=GEQV9-l2y3@L;&S zd48w1343UmmU{2}c9PiHX4#!Bnu`yV90lLxTAblR_J`qgGIuQONF2oGYXcH;aw|#) zxx7==Sgm;oI8=bQKrB%pMgjyai=W=Gpq^x^^dwWAI>|hJf%Jke4TmAQ2b4uA&tJ|< z<*f@b(&PK_NSm`Vn1_&&Zrc(o%2n1 z>X$$FddY(>uxO?SPaDCbglS5Cdxa-EV&C#Sjw$G>OulRX0sK~zL+FgYsiq44PV0!A%b`33qgb`LIdb=67rwCTNkV7XZms^kaRD)2^H5eIjbFlkhWJI zG$$Mku*&6I-u5gym4k-*&f8yBSQY9j7R!#r1ZbI{g%StNtT|rCjss==dQ`S?ezG2j zV0x-vfceU4m#`$dYemahY2QkGsB7V@RK*oL2#+=ewLlRB(!bXHO1(}!@w{3i_aPua zgo@VqSYAy3I}H^9<}oB~7Z%&8Ar&lOdE4_{*rkX&5(-KY9k7hoXI*XSt~eZf*N=uV z_EmPIhTxxdop_F&PUoq!{M6W29`(}HKz>N$SCtMW7=JM~!LRXIF*DFoUdhK?zGzpI%Nj zph-B+wmtDU(INle7aaa-*>3QBmurhYmgqN#Xf1 zy@9y#VxVe=bp{X#<(|$F7=kv4%4l;ZZgdERX%xEaBznBH)EjWDWJC79ko6NStUE)i z!$KXnz#>~&j+wG=^InbxfmPzE3npJwq;^{l?)}5m&Pch{SEc$JYWw@?F`51GxMt9N zrXUEP9TM9%F*da``jo3Hs5>K>Q^zf#vN;9lS>=|Zy-fAWTxdKqSEzezTm+TKL-&^(cNMVnCM#K2*yAE|S3SDkR8CIbn$oTG<&!Aku;hRUA)q-9I(FPw+2hK#}HA3Mh4WFFH#c{Epz0C zx7L|B7`2PJFpK@iyr#JJxh1s!qf1``ytjN%AZ57fM z;y`ln>duCNPRW;YLF~~qqA{4Yv?9SlD|A2H8I_QkSKD5aa=w!wh8MfPMQ2^1aBS@q zI0Cl2fzC!i51CVKF}=(=!U9*`;a}&l#34vs(afLcNc1vU-^wE7$+B}J(;s4HY+ntsI}5t*I9+fCXOgvr>q$yEU2KBR&%o= zsjH7lZ&!(-xr!0y$I6=*-{`)dQxqQeK}a4DK}OaaN%NGPG(_cF{$+F|(3e0KrNR{m z_;msULu8O;E06ZT)-}>ufX%r4nVQItptKb&SuX}%16L#Nsk)1Je6%~p_j2)|p3py)65&Z2d znV*8>yu_>$DxHXWlWG#}*9Sw-qiP^I#k$k#VKw$9ew!Rz&QO^(kStEjDx=;Zz@hoo zRkmC9+^9!hD{)l__Y3vFAFbrX9qQ*Hd$61(E4)y(2Fo#1qD&!W(nAT0Hh@Hl+MG(1 zHD&kLmsX>1XYVQ?{@Bqj2U%&u5G>Mr48V|eR4kitL8LI~(tDHAX6ctY_Slo2nlSUI zH%sOR>2?AHXjY1%sr9l!0)_;tU8N-m0GjBC6m?rb|M)_Qor~a`#E3g=e)T)<(21{^ zFX!st@B`vp-LmoFzCMh>Hwpoxy5>j7+^JRJIt>vfs-$@VkL@5op}nwmaN(EYHSV&% zoZ^YF7d_&~D}+`G>$2Uob;P3rgETY-m;;LQ?eHd$WF9$6aU^T443f+kAAcg#Wt`8b zCoe(-O%28hB3z34(gt+Z6Cn9M!m=^AH#xD3n@hh(6q{~fCaKTG2C-3iJnRFe*dH|B z4KyW71W7}z*hDBH`J+FP48ch#)me4(oV%EuI-fbVCN0%+#~`s)h$GkEj05{@gSnBS z?Rnr>{QBcdyop?Pj2$I1Jm@Jpz3x2Q%(S{oVcUOLAQ{{jN<7T#=PKb@JJzWCw$bYBIS07X5DuW7mMO`g0Xy+&?}08K_fbT(>Rl!1m7>!RobyBJGdq*1o)s zlxlxD?T<{g|1gobdTZaV@Ag$ze#WvHWZ2jmBkc<v&2THaq8IUh_#j3Qfi0F`9 z{;D}13Ed^SDrHcF^m~x{&ZFsy7iz^X&XF+{+KSA#fWTzBn^Z{7!`Cq7nJW|S1na<< zib2%7i}Ht6LhLcp1yN~-CZ`X6ccZJR2yXUmEq+@`%fQ@2T~kUKEQ%C==iVA-_0XR6$XZFSJo{b|0;5-^A3$!+H`mUd9+z|He1zqyaZoQ z#74eJLT5!%j@Ut`Scviqc!Nw_u`+d;&QdW_#566h z*M4@WM@*4OwM?up^#Gu*!oe5)S8$g}Gu67lfDbDacu%D|gU*J!Wiyg^x ziN7_BPjvb>@*;|v%&)8nS`xEolHQ9V^%bv`4Y)dvF)uPYJMzn2OC-b3A zSuoSzmcRU{-aVhQxs7z1)1X{dcLksYRj^chTz={W+VdUmkQ&ZlNIPUmJH;Z4 zwjNHmHBH+p%V>)kk!Lc#O0@Z#9tK-tPrmkW3>+IjpKRZ&SewtUrj|AAk^ZJ%QpCUE zW3E`2tNEksH$Hwv?60-E{Tm|OBOW9>=~+uFYoBUt8{4?Q?=sKYmy-kJ*ZGb6`z%}5 z*!r8bJKQYq8uamNHz$2-cQw9ue&c6-md*402Eq%pyyfY)d(DC@ZuT2b&GN4fvK7LQ zM9B1vX^WSNp~hx#SUBm zO&Dtm|EMkD=A}LCp%HR?W40ysg{s4uchHBd^-OI7Pg9PMc&%-i+%b3A^9er%3JIUx zSMi@cIVXB3H3qMpmOc5j?C1d3bfN{*iI&z8EwSC*6g<@TIKjzcdHDR{0&!3MryT6e zDc7m~%4ZeF^jDyk~K{T!lq0}2GS(*sFn%$-@yucEb;uJ z&F^^^uBpvhb7r=Jl6GN0USanXcTuaU5v^;dIjTrd2SGQi1im6pnI)v~w$$2zV69?D^{v+C4WatGlEE^EYwhoRxS6ACAZ= z;>dCJl(OiRiRZNNw!AEJ3^!oV!F|IdujSvv9--Nc=zEL}P7YKzSqw_SpVT zEU#u2X2)k)L*GTMlfj6k(8 z@|)PKfPLD4)+v^|J!nq0Pyuv;T)W&=Wp4MgZCAVZ*8%LUJL|^QA~hF5Em`K=JA_tb zhuX7ZJpO@%6TDrVhs;|T6O)|i;Epd~eu+#;;|pu3Yf8K7)ITTdvlc(7s}xPLWKW=t zs6|?AVm1bw%jKRhV2ErYZ4B4Af-`J!Je;0q>h%u!Z1>VKS9ZEogbd@n@Rn+bCPanATvkZvrt=%uS>sHUhs&;ax(^$i`f< zy`YaoaM!&PG1O^%gIEEa-hGD(^>-ZM%$ACH`yN0q{x?uf&)e zQ!RuOyUkyjX}$CfnN2$BW%#gZ>|p^*Z$auNBc+_H`<)y-&>FF5Og8kwN)t2b*j|h( zL4wabu3j2$BCgUKMLT2Oy(*JF0GykJaL-nUK`%aYp9fTX?;3{aUY_(D0xk+jlH%E13d z@q#g@bc458kXjb5JE6v6L4;s=Q*qFu`7~BcLsCArwL}c$_uOOkE@-a(O{-{ZjPOTa zZbztUTYi?lC+^xDL~7Zxo97n!xIw@NRFyG5oi6g0To|5?IsQyDAT`R#xu458@rE|H zcevxkVuOpf6buht>B3;<(MU2cWcF?m6_eOll~HWm)8kr9vs)-V;=3J>A6e)VHF*c? zTsqj4A!rJnd3pN2Tt0t8WWq%^I`a;GKP`E3KRxRS)q_fTR)xKvwt41Gf}kH;|G_d5@+A&8Ryhv8Q}?|JU>{dD8!Ov@kBb>Hck=DeBq3q?>l@gPZDK%bL4y z@2&q8XCHk0lBeVErGJ}e?u1i!8^5HRtGoBFWzDEw`@jEd`j$$1KM^a*4Ns;{1q^?bIUrE9n+wZOM-`EeSr?aGa z#oN4`EEbf`o#)7v8ee98QW%J@?O#-cwlQzhye7$uxOq=Wp6(->7m>VqZr&fH!wPwR zL|d+Mmd_@)AMdtGtGD#bT`G0ock9aWwOifAlKZTiTWfP2QTfoen0Z}wQD-NB1Vk4oU0%~<@5*_`+&w!Jf@A2>@60tndci5;8Ua=7K%5ql#y_GSLZ_YhNs;uKvwOUtxG z+b>QWa%=zofs5nAI3vcs^sZ<`RMV*t7^L z4szl?!g9-&NlV2+XQDK6kCrV=tkY{3S>@t6_toX%IVU6~v3bsYlejm0p5?QgPrtYF z1Gn<;`+QF1?~|b+wWr`c(+;oy#`~!kA_mfh@8*lX+~-W05B;0I8hgQOV>MU-&nY3N z%6zC^|6Mtli8)?!s?Fbf`{PS z&Dl#%$jl=LBNgZH-0Rt};qaf1mz7tT(OGPwhqoc4$6<*LiG?7s%IqrthJkXAgn6Q~ zL%Z;67wLMjiGk=`IcL}Ce1*-2Zwd8z9}}BNmtMy0TzmZ5IoVatR$2&~XS4+V5;?JC zcJxiXn+Tg(cWb@*X@CTA_iLAT+9uOEGAfyH^!4O0Duy%r-@1LI%BG@b* zARj%d2?#2YDE?EgA^4!(7E70lLmXW%8z8`l9DIzNpSi2KloXC^r}-30s*MV#=vhnw~5I4|{4H!b_>hqVFK%m&RgILIM+h%D0T41s7J&0MLO zPi17<{nFmQ?2$_Vf75F+ZlrXHOszsAYRcK-@ik!5JRHzBk&W@-fGYDxtOglZ!X&vS z^>J5vX+TdBX827O11P#z{CPdm%FkXa=Z9Y`lo)r%eXctNr~D#JAtM9GzLso=1dReG z)VXH9-j9kv0;v^-PxW8`KZHUH1vuO1pb>+3LDCXX9iJ}yb#ovD_ zN0|6@Pvk@4N#?6fsQZPJHHQdQy!Rb`5zc#>M<3|)#jeGNXj|Ahk}Yb?C(V`FIxj)v zOeBPMqN5hYl=!3*1VtXrG|FJH%HHu zD-|eiI&3L`FXB3p-1NqH@fQ-}+MG56zH)msqmN zMiyo%T`n%8t`3$vv1hf2NOMvD01+fphl=Ltr zaiav?G>%bRB}p(KjN)EjfS}6_`24mjnQYO`x`sRM0+j*ckHzIwm~$iw)CbbDxuP!0 zz>?OxQb!@c5OF7Dptj`)4p1u;!4{MlBp?+)pf9!|ZN4*o9EYavY7j`*)& zhjlEoU7C2dw)xU*_K>xMP$kROIOdruZitTiSW3Yh7Wh}+1Ew8s3i~Wv0q+dk8|Nil z&uP!?R-}QjIaS30QTXR?lB7|15!%<*!LUuZm?_1fN_-%HWXwW#-{E41N0>4qyI&O%H~rmF@-aCxlLo^I_20H(lhRS!B^ z`&_kM?mXaCoc{7HRg%T+Crit7XX3m7=J>c`dz~&OBbGyJf+8kz~ME4*MJ;*V(Sls`HN2r24q=@jRRO!A4w+!5o7(-K$7O>X(7AA_j$r5&NqSsDOZWcpd1oU#r*<`cia zuM!bjH0_x&>3gy$2ZIFiHp>;YVjTDs!wg^{b9EoBpzw)b-_>~vp!oGIVmd_!Mq{kz zZn_-7m(`b^av}OC)2M@3y$5xv2S2ov(=#y5k$YkAF;M*lxoJ`Lo_!9kWL$d~Pt`(` zZ95gLh(=Y+IrM#%{QzfiBl3FCyo_!F$rjuUx40S712?(VxP^Vkqr9NX{8oz#AmKL4V7c-vcXUR9PJOPG!Tt|yeb!PvH7yjmRR+;a0}YOWv$?{O!atz%V%6%9_vZr zvH-l5z#i@JMk|harozAOXu&D-N0TgF)=m0&>)N}#`(453SP&viPx0wqTiHFa?rM;^ zd5Ux-$UNJ9S+7{0sQI(@F9ORn`X~a8@;v#&q(aX%1QRpMQ9yI30Oq5`P>2Tsug+z0 z2qUl8%3|I8R2P8UigA!pY*d-2be3Ff*sJY?IEqPle0;_{ZLhqQX~baH%TUI{lSAfb z|CWtTNT1kXSTOHpB4Dgb8O_J#?r7u^jxAVE6;)=++b&}veuM-Kx}O%PZ|~~pEN|-S373QYe59_b0_3mh^147(A+MQ$mwcy@qRF$FsLo~xV5s=05_O6&IMAI$ zHj(#d=&D4HmSyM}m%pzYKTQv`2Iv;8$&tGKxI*k4()*fXcLWq{eF;iQ&A8~&!t;i+rSEg6jO z_qB-Y*oFNhuGr)_GZOLP1N|jP#o+2ZeXYl%msY0n^PK1`O#P-?vzi$UqVBr3$-<+> zsnpSg<#o#-3TGm?s73YSzD-_=X9LRh6ay@1<)(QESEyph<(ZNbEf1O6GvthL^JG~j zA@;*!^T%5xp5B+bTyZb}h$1Qoi9VR_?%L$#X8!Tafyll~I8@*(c(R!!Q(@U&aiqfZ z`v7dn%bh2qrG7@u7%kC24cqfQG#2M@jiduAixx?w8Hr2^SCBiTf>!4*>F%cK=+;h9 zMx*3to|pv0qM$J~#CWJRXKJK}^j%d!tDL3er?l1fhvPt$Z0#0X*Jyi_ZF^nV>9$@r zz6zqd*n2nm!jU}H|MA`jJDL<@AXfir^UR$@a%8cjThKb@>Q%a0Nu|8Uwqr)Emc)#` zL;xXQ)#rH8Su;dyPJD>OgJPQKRc_TzsPj3V1#$|1nn!pOe&ny3T4}9-`?svfSc2_Y zGvVKn4LF)Qysp2~!3aX;HmMXAZ|9M=R_ffFmZ#)BjzO;|D^Cwa@uc?!_^;>cJopmd z9uF6iC;TFV)qc60g%jIsANBi~V3EF;wGnO)rg2{TS+jtXd5YQCwCLdYmOR1tKUAsP z9p5(3lxg(K417zv$!qL}Z!K#cjP-)=jXS=kf60^n!@cxx^UVD>OQRY6OS-vXWw-vd ztU0l_{^gYBv;G2C{71KmBIvs?hyu_W#iF31#cDI;1?Fs~Cy2zbMr~5D?QU4W^Gs)Y zxItencBdVQVe%gD{(rClxf4JJ;|8wArK7iLrOG_>{1+U#hmGNQt55OFfQz3_Y%i#fX=^c%M#=RSx`Xv@^hU~Ksi}Cpd6q9r=4U0r?%Scc~?+@ z^cNXUHGQ*dhpj{>&)Zel%9bN*7E-hE1&GQ@FuU_$c9Rgh{7oVLVlaqp{w8@#OSFVV z5|ufS8G>NU7WVwkiiT0n7FqKJ=b^}K;;*^}nB;V2iYYH};uo-WpWx_h?XCv_R?6`= z{hSJkJh|=u=tE&V@GgIoyfPdoor+Ru>edp3H&`OX|>4Ixs z4?33$0la|W6!iq2nJ)rKVJ2nn+e%mTF^KqSYoRR?goR!UTYiKkCRCOCk_Zg~ zK|5!Kw^Owob;W4pCvd#3PF(8l0jl&t*QYs)$vx&hc03~CbYmzX)FBheOX={A2QPBj z7g3#};8>1A+SDqysk1Yhaz07{f@9q(3&q($5i;YnRH5kPlyKcInpa!D@qbso#0Gbm zBesl|T4XT1Du(}mY9!)Z=54!}u5AMX@0z!|;4O3E-THw`ERZ>Z6KEEdHPRMJic&p~ za)avpHq{dow~}stkC$Rd+d~_ppt|;NAJ&#YLhbe*0PO*f%yB{h9NsAWxdgCzFYA2+V} zn*JqE`v3J^2lj9C%op(<{Y$!e37g%F{-%JCz%y0wa1aswYR#25DquD6 zhJQT=@7|4B&_dE`OyLo1|MV*x{uJ95IQY|iy$#~MK3h@kDv;Wg1rx%B?bm`IboMGl zt9D8U?5OF*%zC%_rI)J2-YFDzl$w`co#vM)j);&Yw+qfM!HoGQN=8S>E1qYnq!|7t zc<}g}WP_p0qF{W9#M6{hW0tx3W9boy{5MHlPr2WLw@6G2&e>)axvF=fiA`g{FsHi# zR1>v9^r*VwX4gNz>Wt6ypjApdOEb;aWG6bi^vTavg_7rOnvKwqS#K$_8Jk3bqjdTE zsICi8G7E=K4nX+o^-p-WPs3Xq9YEhifR{#x^JikdH}O>S71`_4?I*IvJX?j@;<{IL z!7+x_Vo>Nv7+0mZx@m24+q0?ILM}dxYHGjw5K35iWvGRs6ev>r7C-o62Ex-hWc)vL=oTJ?0rU1U2&uC-#{KQdEQYdcUI2drlkg8omEue8f{)w$5Gh_3zP_|%}KhZGt_d<*mO!*S z|4(XuZ6LYROJx0xP5#1}lx{!-wB!>)qxS5V=8`0NY9(S`%||I@+;l&M!|wek^y9;A zZYH@ZKbz0>cFK3$Jrs&m@j9k1*+^;g^c*hinH%=&Z4{O>*ICa)z1DTo(_H=={L5;Ic z>pmoPS9$@2v-<%2byUhlE}!4(_OV>ct)(1-hNR1S_kbt!?wRg-*WGl@m3AScZ}2xA z&HV{L7m0bGUBx>;)Zxi0Ud#k$tl&-Lq*w6M^u|gYMEkmeM?&TZ#-Gn}1ucJ*)MgpB z$@}Tf4jGfVTp2!MWAw^NGd)qSxf5Kn<}D-okdWzVLH{P{TMtjA{}zC#WtOnvanhosQ-fEcBf0oUn=?H|8T zbx^+ZNxFnC@U51^m3WpDC+>dVkzsu#{vnPM|Aay(u#vQ3pC&MML^8ESOzLPq&7h{9yKq0 z8~wQ{2KnRK%eQfa@Ns5RwVf+UT+hHn{#RBe2PRgO#D+s7%B&u36@gkaz)jVyDKylL zR+o5cMr_SCSpz{hcClW`EO|e@v?O{uNAgk-pr;Ww$n(fm+r-#)UdTY4z&LFR+5d|_ zH|@0xE~OBS_G870%~w`(3Dg^%B$Qig${)1*3}<-9CzUQquJND9}ot;8uITm<#! zvr>Ds9HwW?fKJ$+s1{k`D4RHciMtx(Q)QM=8~pq|rDmvDL1r_m)?wY2)M3eHbe!l~ zIb7)`R&73zc?E4Wj1P-q(fKuRJ@>rQ{hE!*Fx5R z0v+j2G7{GCyh6n(A#a$pR+c$4kJjcmNkHN?8GH+(q&3>n(lX z>PVi*_Y-~~e4@L4&gPkQdT7Ydk4d_@Sf5@@pZBz^8MIWnO-5&6aAPS0%}4^cuKp!Y z`hVp62lj9CjIU?^l5XC;Oe&=N*Rtl8@AcOIysznB@^t*Y^l$UbIz6;xj9=1;@7Jw= zEo%n#+Q06vH&ojF75l+Xvy(T8unB+=dE5d@68aC~0dR#$FaBSV?8cvkK+zsuL>|kg zM7ADz!0kzBN|qygy}wC(;?3Vsh)7r_Yt+no9?a7^x+_Mmas)y2{D->q{)wYFk~eEM ziS42-HdX1ttfi0&>3DfeiaS=-KQtJh%&Rfnn>?k>@^rX=o%p!`kL!G(orFw(xB~6z z{^Hz9zZ|?|p~CYT)uD^auSd{z)S43oVu;=e^!Kv<-UKZWVQRC|)kl1fy&7i-2VF6} zka&2u|5%F^5$T^L>Asietsm6vdy;ZlV|FxqnsHeMgfD8susD){Ww3Vk&3Y`!;>wFW-INuc$TdDM{hS zzVBD$zV8=OQqpKlyzhrhm=1zw+iRb0^;2bX)Gf_?UoSuXzMe(AgqrC7zTRgRiQ@3% zzOUyMh3Ik4Mj&-oT+ECYnI{KxL`B;u-rN1u3A;_UtL>HI&zzMU=RTr0Cf4b#AKX0t zOA@ojeA+zzPlA4)(v!}c!yQoiW!73$p3?K?;Mp(-QW;i2>mfX!2J#2Q1`$;79&A+k z`RporcICejCF@v2Ad3eOB3E(b`yRnSC^;UQn-Y67yZ_$+J5JKvlG$8gagQ~}7Y`Li z%Tp*FX+!9oLm&oS55EwgxGom$ZSrUY#|Nx!CBkaHBfi(k!OWV~%L>Mw9i&-=OjD7G zB~Y)vS#rox+lHc6IR=Qm$uZnF^JLy=p3FOh(9p!|AHo>t6jYgG`GYZr%qaaM^YVo? zqQG)c-{tpG>1TE^|79;&R9mI>&2u`iKOCd)@g1p+hw#yQNv20$^?QatXq-~K->!dq zV%v)3VZLp=!Y2b}3|Sc}SbJXBFiq)^V`~v|UeMfdiYwGZk=2@ zk;+LYM5GGtW}fmVBS)`V?#Tgw$Y9b35>4TrX*|zqKlv#ie<5nFp8Rxc~7ecsBz+?(uR>(oBB8Ojn66L=Colj1_I;uti3k7 z|I6`(Wi+y+3=ng$Z_;Zn4=pr=;!DPwU($%|AF#S7gt7XYc&q_ExL;2Rd6kawJH}Sngya6n{ALpOgoUz%-WBJbE;lVj$J;}rRE*YCV zls^N>A$%7n2k>2yWYA+9sjm-p)!UwMWBZYY^&{SlT~y=t)YR0?f{#I8fXN$-hfOMM z=&z$46c3FT1dZ>zq%>%T+o4gMbHFnc=dW`@@ydy&g&+Je#cbz>Ken~Ro-NEIk`oqqLE6URq-+He% z;%l!QpU>|;l7lCxwy6BjWd#IHdkuVA7Mfev*ZjOsN2mEK=M-meMtVPUBk3q_dcZOT zSo)`7;RZVeOuhocGnqRh`3lWK0cU`Mlds@(#ZB+g=2RKqy@ALn%I3S8>}`C56LZG5 zZ_bbOYv1hARta+Aj?zUQ|EL;>PVV(ku5xUSIKA>#90q_{7?L)KJl}e6&V!ASK23AV zB5wgFe~gd3qW!~{d(xrCZ8!Rv=+r)qMq*zCv=n24+lRUD0vo|t0Q91tJ z;%NV-mTQLTQ>e*4+G6|WoQRiRh_sVZ&ZqI!Yx`IHe`~+ETl)a(TYH@i&T?kyptC)C#W+4?*d$@FzA(d`Gd^n6)cW14tZ0a+{n zx95<4gTAuB=Jv!G;ZZQ8h2`_PJ)oRtY*4=79w<1=>K#*ufMOqa_>r$5+#|5hfT=V_Tx$jISNc;TTM>6l- z@44rmd+xbsNi57H_A(ccD3k$mE(~k2f`1m*h&!z!vgKmgah%TL7d})~-r`0Bv8cF8 zC!Q^KOiTCA-YML0^9OKN-qk{jXG`YZGai3aIZ-440YHk3(QA$Mw*2>^QPw}oFpaNW zoQbdPvE0d=_}Z)9vV1Hd(ul9EX7)o9bvi-k*8s-G*B)xh_K@YXlBg0fYcK1HubpN7 zrT_Wo{`dR1nryY;VS&E>Oq*Z&y+&2$`@tFJ1aj?cF0;z`j=SrX&; zFA>QV?+)9xdg#9ld1A0poWPr6))#yf#nl-oZf>Qu`VD8a>U$QlFL=JcQj0|>MJ^-( zrK`=^8wJx*fRTHD@@e?mUrUj#cu0Up9wv^NZ(oC19vVLsL$Snr-^hsz;%-LTho6?N zq>YJ1%}YW(oEBgZH&vX1-kmEMjUzECg(2EB=LgjApQ1p_gwCZ$)Kl1aJ>=&}xCY-; zL?xn)S2tbc6Vd3W1m*+;W9l~ym-h=1*R|s)y)$u%_QGXeB)QyV9t|qO*=^|o;^iYO zAo!dsnj(nOHkrS9iIzlKd-Fx4nRNg_;o&1zteDwkdJtBW9;$2);+Pn#aD*iCBH8r} zG2Vs{m1l^ZROosSlJ~?Bfc!8DID(28(f{={`=o*M#bCoetRd}%S%lAC)$Jt&R30?} zNumPZFh zs}&=YlARV7Wys?_q5kso1WD8P%k+5i4>mj^pf3hn&&9=_o=w4q-;4_+syHqW|GIL~)KahWEASBru*(~a=R-en{F zkDW4O!Q-p1lYA63k-#>i1*&q1x>R#`Z>R^A(lklU%ICGL`7*9sFL(9e2R3!@f6Wiw zza7ap9W~wBleDP0eYfoiy*2}X*>%1*lnE7f8_FKzkHia>zp)y*;lthjusO3JwQ)JW z(aZamB=9#V<{onsh>iUZ^R|S(P3EB9`H1QbCh=U#1d z1pM&Bv)xr?qOKrhQH?wvI8-d^WsnvQp8Shc^Dw%-oQFuzN)nekk@Hn_F1Q1=o(O@4 z`j)q-1yD#&LIgF(WJVvndKm@b&jpEiFE~QxAljbwbvzX|h;-63%zi~0FkJ zCi3K!dJZ3gth^v3Q&<@+uwY+?X0c*x^3Z70DEk(G_0pP`6j_I<9mSI`3jhPiKN^HK z$x*}@<%KVAKR-|Dy+J-lX0gkRE>bJ663VMVmDJT5*qZ?dd7$@d#yYuUa zBV{;utzBhqk=k+@+NE}()JEEiCP3fa#y5OK4MKVfHhlLha8l3V}V! z7B&4;7eA}HVjHmc^Gv+Sz+5Uf{h3oc8*lP!X>XAvsehu~$D5oqocn_9Ivvfv;lK`H z(VMuyDWh39Gr11{r#;nTOs)coESZp#d$4Mj^dtmHcvKI`I%Yynp20X!*AP7@Ro5tz z6-n>;%<(pTKqkFb(rv8Caa!KO z8|sB>qZdw(g}u~CBr=njCPs+=D;#BEo}laq=|lk&GuJ7RkauLAI)A&Hs_BBP30=@_ zJ=aX@{_RMnmwdbC_*E2N`J5k@_aqy}YFH9PK)e>qDP!DJEYDndF5%Uo#@FrTx#;oU#LGXx4zU7O1 z<|TU&mp=VVz7l?Cm5eIKmt(L|l^dm`&ER?xuxWT zF5FNcj3w2)vvV}ux=wI_6AH5_Y2aA#CH*mDgOU~F#km-jxfOqx35di&v>Aq15$l|r z#uYCx0bv1g?aobOf8k~Ic&`^#3ZP)A#(YK%ZmS{kP%{?8N$6m@%vnxvj$~TB3@?8l zFW)B(z-jc=^@*F5Zde!?ky{iT#35_ z^&W#g^&g~=di3Zl<{{};{Jr3Nu`|d>#rF&L|K0%F^6NW8OIk9`se_Li^Q6|#`r@?b z$-rTPUm{P6q0&KQJrmY7;6bErPo`L6wa4O)IBc&m7i$|~!m^o9pO@iCx%2AV3IrK( zIq@-xtX#z7PK0O05rL_s8m?Xl;6ADtl#BYR&C^!tEZr+wW4?Ss$piK8p}r$}b~WbK z89#K^${|^=9fdh0f6p3Nri51^;kPV<>=vn&h_eY;M#WvNDHRl%>T_C1!8;-;eMw>M zav~A0aW3q(znN^8zJcTk(oROf&0BKvt$w@BGqm~ZsJz*8kKtVs<+ZnC}E}{Uf=`s;t=yX<0c+nastl86~K6ZadvrOdPtg_XMloLy& z@v3hn#vYZj&j(ois&VqP@*r&+X5QmH?N;;Xu^)bI4lX`2{s|k(0wlq&Mfg+eKA?X^ zBI9>qm7zzWXI9WEXH`!~fSgt6IfePj)1mNHvf`sdT<>a~xs#hBQagO zM7z%G?`r99qTfB)M?>YG?>$2PA03-+jhj3b6?iQfi( zP57L%ftH4lm1|lZ!-mWUs^zFR2i(oh<9t%3F?8ed@Ki{q>sQr|<|)1Md3e&Ca2n9EuQnqVD9SQF0GAqIISX0yL}`1HMl$;4P96)V;u_)?$5;_7 zgITs$YOXM<2_D2JlB`RadZ|64Lq>>E>343YPn}ouv|v60o(ukyom=vkZttcAGVwnOr%}0cNZ z7OB3aN3I!~+xy`4a{84WIriDWL0t~bkkG?VufXgIm zhw9>RJC%uqbc$|hqpzPB-OY3Uo@q5P4t=~0nJXc?GeGo+=XJQGB!&O1o7~75i@_%B!86n zo~7I*@xQ@Crfw>@Ap|FXXB;CKN3Rujv!mEmDVT_EXnHTOD_mWht-4V?N(iMD*>#C0 z8!R)2dfg%$JU|Xh=Fg}a|H!DEel%w3hNv$pS%e~fs`M`0E`YG=x=J)v^K$g=F*37& zm#g_fNxL@JF7>sl+G~rFCaqsh>;JnEYrirgeQL~%3qw+^|D& z`N1FLt3vk7`L?RQZgKCahm*B#)(&q`EZ3B-1DBDi^9vucC((xDM0cy?!`Hq5PtK~3 z4G{MBlwtIVGiq)`kP84%B=dRE5;9ze*%wab zNPo!me%kJgwx)?bYv=<1nJHLzA^NnJ@I_~(xO<732he+w-6cV0E@tM{W-oo|@{RpO zaHF?q#HYq%M3dgno#;a;Yx+8!w!q_HSIq-@uGJJ~b%^TA_O!i;IE>{CfH`?-afuwh z{CIu5lteZU+D2bMg_yD`2-lc#v@APHxB9Y(TkF%+t2V=Imu(XnD}+iE_`39)0wkF$ zOC-LPDuFrIL&eKKOGMDDizlUtx*1rH(gw5woGQj8`dAE6Gzv-)Hxbgf60Wf)0dy3^FppeFrJgX z5b`2+%sq*3W_3L+TjmA1QhTYMqbK^3Jc=dIOo+4!~B`7)(@XN~qAy z^v8<`hiP@hD-0}(0zN*71CFRj|&Ruxz|pK8^0R26l3@n{ybmHz|l)BZL8Fn};( zvc8$_gN^@^tS$W0wO8bq+(G>H%PR9wM)`rI)a6Uad-ERu-qC6Hp@Q>MPI@o%-TShI ziQiQz!g6oF^@BrZoO;#ZXf6=K!X9q_5tr)SI&>a7icRv-6S_&L@9BT;WzRR+|7C#L zhxclXi)pchW&&o8Me!~oP|^y2KjJAxd?-NI3$UmExu>>Q3K+_`?fO75#G9NkF`6rZ z8U#%L-8T95le;t-hZ%iHSgwG1#emC}wUXdSdXtkos8TKVZ`0tWdA_#EoaNB=6GU2V zrm_GaV`eWSt4vLAs`IB0R=H8g0^^M}3JkH~StRNMqfzBM;%_<*Q14(sQc7yMNIEgE zIiE@6y9jkkGW#NZ=#?p&;*Ip}c1vH?Q&+3_Q>mZm&xdRydQg(4^cv#K`|PbcwvHkn zfyR-BJfv0vW0ZUmTqdCUYSrdo60kqfc2O9RSqHpFl~hkKuLqv>P})eG?rah;h47E% zZFvSgz&r&&LE%Y(6tSI-^+u;vz#Jl0s_$-GQWYh8G|lp*d%MA=slK*ifg#6Yf9_tQ z!n$!*+hj|8rnjPFE4ieJ5kLn2a>#u@rS|m$6!YwSy|d{Lx9F5(W;IL6x^N8H^Jn8A z#TP`0Lf{1nQ4@^e-Y0CHw5ZBn7ymhBT{KkbQ~L@zm`5B9PVezJfNGlPr&ft+)LJZ2 z@M>jp5H7JDmywF(9nU6aqz!;aVR0+*?sJP4$cN8n*7;7f3fh?!{jglOTnFkX%_e9%7iz+-~d(!%uWC-FhFU!niCtv_K5WNZb&c4U~|f?~##dwZ_c7+Kf*h7BYNO z2AW3CqnH#9XP&2fK1+F+e)kqyL#%@c2XMkkmdtTY!%DXvCIT(FzaNWB;H|gKm z*wH+}zdd=PI~kcn^X!07lvE$H!?N~;$sy?=EZquSS=D{o%k7W3{82hi!5&d-Q%!n! zin(QF>Eh;j0T?TBqm=I!XSPM~YT4t>i+!%hu#{sU{*&1ANu-gskXYY*rELlx|H=(Q zi{u-`MS};hkB<3Lqm^8w`kK@1=upwPLWkGx0TqsO0A(2PZy)t2L$G0nP@bT^lwD_g z;HB*MAdG0Kl%h{kp^QN&xJqdh6tu#m`Yd(@v2#*44c9@bh)*Dnj@r2=LtV`n`l zhm!BQ@ers{@`wlef#U8l8afEP7=59y z?gTk|I=*2>TjS=Z?7h2U$7CgF(0=YOy1|8v!A-qvhCy0nAMYf13p9gbLtyl5U)`~pi{`KYqtqV)A+38cwFF+^v)$Yr5kKybZy)DM{l-wmY~PY~ zuDA%CHJuvvYI>4aV^FpE>a#SRFw?#X=#U=wU?pbMN*HZI|>Z0RBzvWi;2<(K1|4<`^YH@_{MKsi7S zRJ;>xIGMuADY)OP`^cw-VojHY%|eQC>NXWNUFL7PEYNgW$UNE?uvgR*r8duz>u}Tg zK6BEKx}tK#%?E3}t@Z`|;YoyR(@6>ej;LV6n3 z{y(s5d(3=|FJnigmpbag=Bc4XewAy?Ew2eWlr|luH}T@jPtk1w4n%N*J^(YA(qz$S zPS(_5FDpIJofsfa7rj!b&R?-^sa%bOd&EU*s;3lVy(xA<821g0pUEwUVuoVq6xBoB z^Mg$>p{wvM`1gh?%?@7Q0)52)d}xN_r|9B?uysjJ@_R;#B(_>l>$148 zVV(4nNrL)>2vC$T_d^^iTITlT$z|+A66Rr8Sv_ zCaU-le-OgB!X5Z4zE2M1s0+gq4nwN=1Kx;91#tai=4H!hP+!kPe`|ebL5e&7#}6t_ z!08k*#S%nXa`q70ErPxf9bq4&C1^&cQD-&qE!h06S5EYY-r~P=nfZPEmH+PGziasq z2tr>{n0i!-y3Z!s_o05?pLAMV(z{}uZ)p*yePO;e@yIE!hgkNzqcU8OBnmp`U1bi_ znawYMel!suDt*Bl))C^!{W94*YL2z@D%{RxCqqxU95-%Ju@$^rV+-T)CyN=;c2G_( z;e3NozV`mqmGNfBFX2Y?zU0k^Z{F5!--_{C)TFjq2ul1NnL%wK7Z&@+of5YU~BSV|&&yJV=wUn-Sw*MaHH&l-@B#AXHBihUP zoRxA~7D6+|CFUjin!~hL^gJ?Wh42J+KH}8ItrC~7zRve^v%BSo{%d|}Z%2LnXm95c zKeDfBRl6+d4fn&e>y9hyd^gh{<%bH{^2%RG`QQAkd|1mXeo+39obq!ie^ys{MIDNi zXN#Oq?B2enGFyZJh!136`%FlxOgsBOy?+b1^%5S5V=(tEWt0r2PJtoW*O{1YHbE@C zzNYNoL?LHvZ;9QiE?evaNN{zrJJ3B5Kfj%?=q^tZ zVMLQkCCTmG9Byj%aV7*;$Mdm#97p(={Av(Qn6H-9KYsq=>f!s|&ZXJmokuM1zUJTW zDHL+nHzMn0`S*>*yw7GadnYv1Vs_Nu94M2r-j$-; zfyU=bqAb*G`*Ubt77Zy;s#vAif!416R^;}_s!NBQ2{!mA++D=ntt2{tq^pZF&TYRa zr+s;5Rrl-y_qUZLkq6KC&+y`vcRh$`vt7ga7U@f7W2-Dq_jM_A$BUH;YxT`(p^hoE z%a}a24;~vMfX-hnXx;6-gvIg4MetufjRDJn$Brm*#D|vMOvQ*sZh&wJUlYmleH+SX~$lcG`@!V09 zJ09^1of%Jp@!a*V-Hd0~Ew76JPc5nP$*bQmi$!Xl;!;OVjUZ^dfm(%iKM_kHe8h2>?{A}a0dAl(E zH|)$T60zyy-mYhA0WjaXGarxFna<5Jh7XR&POuvhu;VF`@cjW2V?nmQI5?I12kfr?Uu=D{i#hdkn&}R2Ve|;c zg2DrGrXu6qp}j(c3h}PWI0NEu5Pv^^&aQWID28``yo+xUO%M79HwF>I^yNp)`1zN; zm{APN_9Z{O`7?ewnMydBpsz5N0gcoX;dXwh5MGg>k3~KR^$0|(l=+1kn}0C^!8Zal z#Gm<;)9(pZMRjgwr}`3YaheU4O@3LnvfP-CKLn3}BB#79(?GHp08utP(3%z5bhRM- zxsq-bF4l{utTSuenSP!FPX{^~x!B@^C3NPglCqsUEb*_m2qds$^6?{PetJbAAy={2 zXW1vN^q*u3qJL9u-XXgd{bGB8ojwy%sGOM}dYcRr#r4eMU5t!n=e_S}^apXYXkGu;sPXwhbAMSMaFyOWEMH04uiVqdvq;(?;~eTrh4 zLXwZXg`>;LWORL?ch)Rgo_O|jmRI>hPLzMlg=!xGej=?+zO5{DhOzcK_39^&k>?@w zQIXpE`*%#; zAUe^DfPToVeX$GrrA$p>Cug2;^nGGxszTe^q}VHr%%8mc*0wz9sjbrI?=62+Q19Il zx_Zy@-%?&iBIW!1pUOwgd)!zVN%uyrKFw=H^8vHUx4B>HHZB?tNK8dqy}|VK_HU%s z-Pj$M;@o5r?w?9&r5eG8gL$M~S;X~vI8PkG)tiHlhpRf)S0>L7u5Cd!Cv4(Mv}wI` ze`;cIt*Mxch2*G?^`*(6jj2t3hp);Hjgfor$-Wi7-ek}qEqHYiV0EnbC)XjqpiFRW zQ3Wlh8Yz%ozGJ;gc+Lo}-E7+vSyQIX^5EL%fO&{O(!GOgWBC=EQxZaEWnXuqZ$+Rm zw;$<)VGwwR^1-zOD>erkMJ1Ku?GgUUi05QSOsbR)Ha^e(8nciv&L{gG>ch}!roA1| zkGasM_43kQm9$^kG{2X&PSTR8f`@wAX-nM)Nn@_T#`)54S+FtAUlfXok5=Bf{JYCU zc9vQK6%L^qA?^x;tB1|m;XAK5pQCdG5HE9gCI_X9tbeKC>Uk1u(iTX4x%}9pQ`46( z%Rf3*OElcz>Qh7oID#fH#;54Ga37`Q@x}QxUvjkUqA!voDCIRlM(WG-;N{;9OZAZf z97u`wO973jgS02*j)RasxVD%xjw=A9Gs$3TC2HcxYEy}91C1<3 ztQ09(w32Ja3f#-Cgx!_o6==#oD5DUXX6Mso9J~JDw!)2arzk8!nA~vC51lI~au4(q zNTWYA7{RRI5lOB24K1l`n~GyQR)pFoLW8nUmo>%#iiGK)$&nj<{V|T?m`8-V@&%=J z?nGZLXZaHQl_SE5v^qrN$+IM34laoaHSK*liF4q9&if~uYpw*R4%eEu5FWEBGa{UB zys_+iri}wqwvs>ic;Lj2b)n<{oG7Hg=i~Dwh4m&emCleTuRLD5PAqP+T-5u+S*|Ij}A2cHMS00}qBUVm4xOSAH(<|)a7$}%J#O(~OeZJ!5 zWSQW8pWy0fzVz>l`BNoS>Q*@UYH+Q;;^kB!sd{o*D(1ECR{LVXwIj%j2UmaF;k(qI zIzatDO8YO#);vC+zk5(1)3BCGz7t#kx9&)KLcZC0q7hv)1O!F!#k^lr_Qae@Meu-?!~gxrg8{0F41KR0oIURGk{?8 zl4hegX9}*C%;l*V?}c`Kr+QNDK2i5|BmRFusq~>8>nf9)@(VAe1aWpUD9fg6)=MzJ zFX#jl0@?6)_@*vTKB#?U2DxSeqcN*@dO5;w)|&TzfuzQ;|7b!*aL#|E%-NJ7RQo?VB;8*j0Rc)={haTz zt)JU|ymTio52DgA!ra6lDJmlJjcf*crZC44nlemtOyO5fCp4FU;YE4oGC3MIGO~?V zN@8C36Vcs_irSL0VR@Lx&{X+nuqtfzx_vVAcjc6#&gI|sN%mO&ZLd_Z$h%vXr5m>- zgB9yjz4aYR%BOqQL+QO3s~LF*H%+`1u0-p;qzc!hws3UyE!?Czy4Ie z;OZ0e>(}QOKJR|h;X5ppYG2uF`L{EZ1Bi#b(b0zwWt`4#Uu}n03hr?w3GdWCBk_~Bx_uX5AED8(A0C3SO3lldV>MKV!RYNbzIcbsY+;-wKu-M765dft`AZh-= z)1F|MZ~4-^qfD+-w1CD z7~6_u;=zWaCsA?3?!e1u2^;4eZg$icO`v9+e_*qfunvH zZjkt%a-Z2N=RVW7>pp|W#2)A~ZRN!_c?gSi#&+G3u)F*5bvQvYb=RTEe(8 zlBt!_MM)J8Sbx)6iUtjm#g5G^qU_P;-^fNr`DV+I%r0&mgA~N+k!`a$eY&81m6@kS zB&-&XB2)$M^rqhijP7YJ=h`dY(gw+-0=JSuW~L=^oCV*|x_i9lLRp z(lObb)ut!CFfxRnaQ4D6oN9X_Z6pcuBvaNTt5}AI*B^R^K=|VmeXt))5LFziTIDR4 z+eCp0wb9UI7O!OVgtAe|FqJvIj{a2OmQk!@F-o|D;ZD%&EWO^cC#nxe=iBUe%xv*8 zH2$1;>L_n9eZ9$MsJ)*5{*3&ovv;47(wlJ|6 zVt(BV3IsXgoVILUf##*U@?noCTAo!@BttkR9p-KyPuEsV~sc^Oa;vq*UQuY z9rDR_Ddrq3Yp_Bf6)}@qvfCv&kq!dD+Fu2G_V!Sw&`0XfWmr@SS(sQAI&`Sup;OB+ z^UT)kq;oJ#u4sQ=r|?tZ7gsbJ-zXMO97=@a`6~W^$|QXUKbsEidbM`9-Yz{w(UQ91 z*U}_QQg@W?9;Ke^NJESfBc61w@n*8b))Kv^S+*K_PtSXIY45(BT_8DfowKr254&%u zWdiz8Ty&z;r36N6u=o^IvE~IAm6ECr%v`lfAkY>x>hDj3#nO-JjdEq8AkxbzGjIv`*Wv@ z-ditrUQw*`9|D^2~8Q1Z-6g3t{UUC@ZrFn55 zomAYs^>h}>D!oHLf=XOCY6i=@kyvvQuT6j7Nl!83^1Gg>(cY6K_;kqGppi08VYd^S zUXqtAU0KXEWiRFDTB4n=D(WPAt(+_uEp99AOd(Q5{A+PkqdIOC?<8Z(ai&rQSbH>I zgc^g}#?Y_LxeqlbM|sWf8(clGI@2nL@}y4AolG~WFKE2%;2jcAEEXpwh7hI%J_9;Y zs?cpwC;mJ9&6nl3PvuIdoGdG1Bi6Ug=X`%&c%kgInVtK0k+6l?O_`u%4p`f ztJpZtfsj8+7fAk1uPNUvl@aZs;x!ktA=8tbcNKP>lgZjDsI^VKn}_C0?%vL3&3%tt zVL{DS`sJvOwwy3@`WCgVs3U-K~_8fl1%xw7_ zAhoMay|&0cTK4~Dd7V_+PTG1%386&vZ}n>?eVWT}hiX=0LnNRrjhXW;`^98yI$F61 z#$)b_hDa<-Lw4XX9j(69{?5N>&2Ga5#Io&czIhg9Ts!FkvqmjNN_9`M_90Ha9&`vJ z-dam@&zaxShjQPIpDmjr4Ng|}+ctQCHh3ou);d1`MUJmBIlji9rN`IsDrY;XamP6U z^tW9WnTgtErJ%8>@X+IL(zeGeWwSrxhR{--mLi%{nt?cPLZTwMc((V{tJEBFI$kp6 zbP}Jx%X)~<0kLv8%pD*^7;T`3T?*jQ#v>~KIqrL4B!)Oqv++q;o)-R<`bdxOBPy*n zTxH%|#0b2q zTPgL64tN&s;*Ku~0+Lmc%?g-P0IGLUtc9esh|_OaR3sp&!kL^!@mdrYkIsy*Zfv^8 zwZat>DCh_hWgGLzP$dff24_I@DCky9k0nHTtVQr)egq}}0iDE+b{|it-P|RR^95h5 zJX!tf9eNi5vMd0)=chA@KISRqfT7-}qzl|{m_Xb-K|!6|vZ2ydC^^CuVSTQ=LjBH# zSfyUP;fGEME1w6IqJ&^U6z$o~inReG*`K8lA|LiQJq6-sm^LV!8PS`&jc(H>)B86+ zb+*6uP(}@)e(ZKxlGM58eOAC+fU%hI(;fZz5+g(_3YUZ4@Q#a_r3?(pHsHB4dg0Wf zGHRaU@y+9Ll6yH}7A0m*JwsIdt2fENOZFCkq5IT1U^%q6JFoy;TMy}9=4JWfw{|=fBM!9|$(wMRs{h#W!_>s1`y%(lq=E_k=*x@XNVkRBT+* zj$Zq6`N1ksdP7sCeBeH9MKDH>oPxM5SCXV56@%j}|CAg19V& zufxI*-UqOpB_#`Szi|=EXF>vqMeIsYW8wy&gqnC z^4%{YOti_NEi13e%(hW1ubt;uzb=I99N@Q1WO^J;*!B^Ck6d~ujUb~;->68!aMQzL zwQ?UDR^=?-Z4-)4Kw0o0G@JN>VMTj6`5-)Ji8^Y;nX%idVxc%Xdu3RoBkp3q?p3&n zO@n2}ZnEDobB+Dsy$9fS(gp$UvNrPW4-Cj(QM9Bt3^qa#kcd}K9QpVz=YZ--BH|as zSU?Qbe3Q6F;pH*oyKXScUmW=%`w8G%PZ1USF6rYnEjm2v^+vCY(JC{AQ$cY}wn<7x z0LJA>+(a1fT26)UuLMeSMa1kY7gb`4)s3+ag4@YbYD-kMUNsqhX%Br!tugB}EvJr! zDXT!jz2rH0V#Uc&{g~h7HT!;t78Z&Or#DF}KAA9=^rrC5z;Sld@SA3O-VhkcRKoQ# zGFdxw%L+og;j+G|E@B32)xhkTc3MK0EkAJN2l-H1R7PJ?(K;f5u=&*{ zAiHc=`8si+vVT&Ocia+n*rtrSNB8Yup&fwCf&{-Y|QJ)ZsViknN(+7 zVaDYz@b#Dq(H|@C9DR(S0?WB3FFD+u8mJ%h1nc@lGT?@4#HFk3t1t!Jz#1$D9@c|c zn6CWSr5@gX z+u3tJ*Yy&7$?A{y0wu(|VJtb)JqmVz@esQn$P>mq#H=0?oxv*efa1K50+)Os?hehL zAJJ1-Ei~jVc1z})$y=vE#6Q#-`XH5nIS^d2f~Bvi<;?;66;?rBzVW9|A!K32?(ljx zm7qjwANc99uJ2JxR>s+uS@Mdbmb9nK$Sei_9<69yh=2Y?eQc?{b4$Gk`i2pE@*aI0 z&7;r$u#$L&FMHyW%Q5T|YqF27&^?I#pXU3}0utcxzcoKB>gF$I&E|`{eKY>-ebSLU z@!wKBTrG=*H=ExpuP)?_m_t~=MJ-;OG;=g6r_C5`FZ%^t+ zZKJm@7X|-a>aY3qe~e%9Wc-uWwPg44+dOmYF8w)@ZWj5vjbF=}A-fwtr>3tE^>_gb zdQBzO=I@x5vsIM6#GbJ1lK&20$&>NjbC7h`eS9|0{LsHUJRC_kuN8J1pO!V37fa%< z@Nxb}|B@&D|6(`&+dQ*m*Zw8l#JcydWljEW`)~Ol{Y#$C|G=Nm-{zSg_Sj|ql5Sor z=r(^XYc4O^&HQ&+A13VDv%nX!z_TC8BHUw({hU+pRkQe+LY4O|#&37IY^9feO=ch`J@4OazG(#&PXd9BV7+!NQpMVrg3*V2+5J z6RF0qXHVB*#m&)tTYYdH`8XZ<{yOrAR|p_Q&_fGpGyd5-wob>=YRA?beNRNXTVBY5 zV~BvG#5n>Kw#%^qrRpJO^Fs;_Md3wZc{b&K{|nReQnfiP;>l}lw#GQE@%yeCLM%c~ zWwtWeU2p=0TP=Bcp(U62^aITbp6ghe|PlSA+ zPkNhN3&IWCnl3C!1`?HKe?)@7JKdivWofk;xKNDXLYgQB?oIjPDtNry?;xJ1D!c46 zl|s?UlrC*^yIeNKgRXo^dl1Zy$DxT%@kxMIv`%W_#oj@FZ^T z?;+dcYqrX++XE;6qBH+3US8ZFHYYBD;R5RAh6Qb!c63id1HqkcaO>>}`i!bB7`d#omCOeJ=*#E)* z{J9%E7lbW57h*L7t&N*&)r&b>kdVt0Gj%nxh*r(35&aU~ z4~Gal#k0#BR&z{u0cS3=ws7{o@64o;-W&F^usQI8LJ8nDctF}k;oX4(^ zSBS(?mgPR}&6)>6C4>!FMB7mleMbI0{TmsK9Ok_fi)_6M(j$3^NzB9FT@lS%m$a## zO-FeEgwQk;ODzFO8pq)|y;a!WV&*^jQbOU>1)fc7PK8REfw&#b_>-MbHVwd^;pryM z#c@J;M-?K_;mE4QAEZRy7H^Ry<=e_X<8Q`mIF9i1^>NjA#)HE@#ZXgzg zBQcwLzDfE7b%Ix4;I+I4VeX8s>H{fM@m1ZSqi6b3A+z6pKVjzIBu))~1cvTJebj=NxpZiT)mim{ zWPljrT_9{OzffVrdc}cHn6WJ*MI1}W;FI&=cZAy8O&4sqhsrUt3b*$$+%6>j+Un@J zsQHUu1hFR$tDBjFY_mM+-bY`AMUX>LHW2=z#!^GkO5b*6~ktx?G#*f1s!Wm$*uY%h+`#>0_O~+1VB8t}DC?1qJgq5McG&PiJ`c5}~AJTzVU@lEB)5 zLPZ{CT?RBn#j+H?()Ik*Io<|IQ+hBkwV$F?LEN0D9uiwa2`0slD%Wv?9G9+`&aLSsG zFj7&@eUv*flyRXeu5(8TVdOs{lIlE{zd|5K@If+7QmiNnP`8CM2wyc!&c=?w$hr2zis65haeOelP1Q%-X5wpib3c;>iju zOBD(9(!Dq&XXi=(eo$fowf`!j4Nqgv}L7HWy9S4m@C%1sgsTVjk}&gX+hi z7`;L?k{ajyMW)@uakCqzQ~~?<+of2zeLtRVo!?|LFVM^fz04vq>0nB-E^h8S&x1VYh1nd(OCZQ4&+@~o+1qtUePo@n z>tA++xt4*&#cAAcZGD`^wK(r*y0wu`WK%d^&+EuSvu*nB%1rRe+(sFcCuN>)?`k5X zNZ7ezuUk~+mJM+}&-9Qe(uwu-s{Tr$2&R)9jEbSTcr((0dlO6 zJ-T$Zj%?l^Brn|loa_cxg$}~;cr=bS*Vq4)EIp?0w|k|O#$I9#DTpeyzoISGOMbGN zp>$uF6E~`7`9g;y z02^r&{*_IL*n}6e2_-h+DVv~MTrS-bLoLK5B+2S9Gg5HZByIPslmVj_!f#?e6olwLE0zb?aVILJFq7)`##dHjlC& zpoA|M^v#+gjxxC|iExqsiT;2;QEtwL?rP7|QBIfply~52K6In8C60@=%?B32IGH)p zt2n{q61#V1$W6xu&?uI8zf7by(|O%5p{Q}bu;0bKXOyNm2`@bdAQ`2#guKr&=D+5UB|8>5i=1kjvg#JI$?5_Urw#9eT zzxXEg9Ehg+nYDBVK`u;9u;7j|)kIfUqCZeb^XHNzD~5i_Y8eMwZ%94*S99o@ifmW^ z1Q*m0CCUN(!A+JDi{1Mj>NK+8R|;ha5!l^GHp^psjhjVMS~eSaCbjRDZ}c1qArx#l zQ;yL7amY`nHX&EpVBCz)Z6f1OuyxH`2#L9|CHMa6(DV`k{1TPMFNwQPl{HXIZ##Nu zLq<4eN}pw#amdzD`fi2CF(mcMb{?P!$kHNs!cWRUtQ&A)yDHh7g!9sBQ$QK3o7n;V z8|H3II>67{!UMkTA_Y}S{4E`Lx`T8GzTE^1;D2WdB`D%wp#*Koxqt+^{>=Vz>`RbeNu|qBtk#etM{>Z#P4r9;34;xC909%&a=REKRZ62=f=bNEfG|<+ zzGFU6L8a{MVlLEp1ncG8MOW=HSxmq^8uxrL8mZsubF0Ob&ZvbE<=+mkI1DpW!q>0! z)vpKQzKcGkk(t5OhX+^hdGJ@MiEy~6DWUpA@}z9?p}EPw%q9=YO^#@C&x5~A_HFD? zQOB}k>=@F-H|G>>6dM^JFbv*k;9q2em42WY8`bHV@vT2}n$OT`mFs9J>at(r;L(<+ zz^JGhw?W}NvdZkZnqzWC*$mEZ3JiBI3s;+eJe<8tCKuNqlT7tABR*9oHFEheHvtI} zmU#&%>70VJSAbhqZ7$g^Z$3Ls{&%{ljh)LXomaEVCf>n@n7e+fdG#-LwinA)^093G zIhxK8kUsGnY|#rzbj z@7yyL(=VS~KmPuZqRogZcPkR0Q3kDRdKbQ~VZOA^E>k=J$)d2hX_*a<1ZV)UZh+Jo zAnZAlWyl0G91{uD*xZ@m|{}W^7&C^F8ex5nSzaf6|@&NxAif%5=b{}lKj%H;D!G^1>JO%KaF2j%|lQ-wK@j8rlhin@*W0W~>hQd#{?gvQ5 z;mx_EC?i*2S3+BxS!PiJM9|uY&SW*Jy~X=cO*3`z9%TYT>4aR2sWNxSy2a4PI*}_T ztVS88l=GM{WLlQ`W^I$Bjp=hu6z_jg^Un0lNE$l8J9kzfF|v((e&?AhR0s}ll{zRI zH5=NP6(^>W>$%j9Ck7=(#tb9(7QR6qA1$T2C#KYUiV&D-?pC4S6QbriWGi6rClhT; zXj%jtj+S9fDLYvLi?v0>yI+lymLBkPC?i3AZDRc(66O27!PMHgL1L427WzQTj;7<&Qn~N|J^p2sANHS-=4@)G@u1>^2O0Iguxq;;i6WMNt zZGTDo!xZe`Euo>P7L*Gi^}{=8T;%D&#w}n8IzVsVK~>}|hu4~gdTuH)6-5#)%61Ai-a}FIPx=rS zT?}`=2afgviX}P|!)wgO-okGyS^JjKc6;q#WB$^W{+@JLnIQ4zu0+}Vv@p2FG;}3O zRM*5XDLJnz@lPaT7dEz+GWJ54M84=$mJ|_`^W0NqmiX)t;1TbPjhvszkDF_@DnxWD zA(=|EGz}+yqu6g+$pS1+DAiZvvwHJN%fqP{6%3PT4!2+-&SE^Krv=bS9cLpl3i8;< z&VoPZG%H4W<9S_x#luXsdGOQk!SuE*Iu48Jf-}UkB!d;S*1wYEVX?Ij8Tcsn5lBwB z{lPy8pRZ%nP_c<6^!Lpw?GK>^<`?orxa<2%%OC|hqSHt<8t;*~nbTJtjeSKPF}tW%jaT_;^@o=~pLhXrceY)`7x1-~^u zHljI_CNuBb4P|*GNnraBf8|P2!rz$tSXr3AjU6IwDCHL~ej76bu^V9_WBIg6$5P(X zei50v6`r_LSHFJepyXgHC09bf0LQCC%v0I&$59?-zC&u_=J7i+$HHLel}sO;3{t_( zR@j3a#E*DnzUo6uKE%X(u+`epE-uy@r)6ur%VKsklnrC_yeeJAm-)00t7u|?NDRR- z@D=0cY?tG-fd~!6%t9j+BErl>*%JgfjFs_NRGh`COBn6dR{Hk}d2Aj_rIWq*`EtIF=> zkF5T!{FT*zfWNZ(l8y~i#XE90;-nnLeMwBeBK%jD3adIn7gcQk3?9L)ffxGQpSF#?bQ6<@Fc*JVpx+AdO-8gs*&g45RC3~x0JBu34( zr)bM^_*^8tHIzNY7^5uBB)!)M)I1FZ;|s`T-6gj)*!UH#M@>z(^40H?z(ggx{zG~F z3ZsE~oaW26Eq70n+f}tVn2ZS5KdQ>4)(eIzLoPQNn9Sh`U$r^(Nk!cBK8SO3N>A=8 zou>2-JCwXqHc{BELGe3aFB9f3f7SZZT(x;c)E7AveZ0c-;~p?PYSum``98T)G7jz) zZ?Dz_LQCn3Ap|6>0gh5r6*R*24;Kj)%Oy{ZkI;LqSyQ0G%CT}`4mSSYjz1#oc44jg z9>kKd)7!Oa#dy8Lg;GnMK3)5wok$UR*4>ukd~X~e3^89c%0_wqWa&H7j!&;Vwd+rB zvynixWJ*guOG(?w-rwNf!ueEKzXDUYoMZ)XgElg({Sg}R)Dc322)y7eIVy!vGn_IwgO%RNV<{~}hgo9gg3s|Br508`L;6W(FVC{GY&cOhK*(ur_=-vd{A2At2NjB8_3Dam+2wx zg9MB}J<=JK89ka0vd+Z}UG8wJ9r3Vep?jI;d{(bHyfgNpt>nv;?(p#F;jRc zJpqe2gAtCq%DjhYNLUFm_RS1`lO2D@z3QLDuO*}AVl4?XksMh+DwO)ATu`fc;z@*1 zvXY<^1iBVZ+1b8#QAk7)VR0<8V3G{3oQb~byuJj=oPNdVhPzBaj*i##O+O8)0~8IOPVbUlVLcGhvT z(#Q$>^?UZP#M1*4x!8%+YulI5_7j(T6S2P6<%0Vf+f0D(Zs$Ne5bvhCoV{aaCOa)= zit!X4H{;%vtuxG;J!cFs<7O}IuOX+u5=V~uOqYx4a#Hs$34%oYPw8{Jyc6Dp^iH?| z3G}(Qvno?pb!YH41^(OWnL$0r#)Utie%w5O)C3Hhg=YyJ5|Kq#7B%oVHpCq(etE_W zO_l^#k2vVnDguTWwth%+8} zUasX2IkOg!>b>{vL=-AB4o`n9qs+oQTg;zbWHgV?iH?6~OPY9-t}wG)q<+7stTd#oInfAskLR3DsS*RL-C;2!`- zbsv}8g7t5Hz+JkZLlTWbqN4iEv=g+?#+Ic;){{GjLFr^oV~|}fSb4`s2na-{e*(Vc zX+k0^`%S;@P533QGFky|+S#ymq!s&~?YV+omeM!*tRsba_B&?g*dJ`N`tLfu=TG-r z%w$`0-Af(3-rZc^*-0SHXLo0BFHZ*r73-IccaLybtwez{l1*9D`I@DJ2gjRFDyXf> ze3m2%nx|FRGS!-x4b7K{ohU?cjSr^6d~`=He<|*gS2mQ1TZV=fVI>3nl50emzn4sO zBp)Izy3r?t72199>ZgRX=;Ks?$EmN$um$BF5C5wLmH%!3H6`!O=lOdKS5v-CE^rXtK>a89vkDZbr%dZU2CtcYGF~%31oMKzmxbs)WyjU9Eh%ss zrTv^~(=ww9F{-t=iqhdPyLmb%pr46x9(iHr^8pIHIB8wzLOfo+&FVkp!Ye`&>cs$R zIKSfVckUbIpSf+k(PpTQ_D-yj2$ka%Sf;F7re8bRWRn;UpqQxLJIk8Vx% z$(vEO$BG$c{o8K`_G1cy4Wc5rd`a0JdDc+_t}i<3_6B&v4t`;!@31kwPy+ux?Hki4 zRdn!I^qr<`fBdI6ekP;MONzox7%}66<8|#!56E}aJhRQpdtIZnx7N&3_=eMiP>zY@ zW!IwCy!xsIygXG$lEIjA(6wf*O{Q`9Jm#fbbd?#z%6U)-Uegc$xcy5+kx%#Re&SZe!@+L!Cb*zGz3H6qeG4no*SYpV@ov9zf-X_ayk~PWC%x=`i66jS zBedgLxzM_Aqy`BItc5wT@8_`rZnf@%j==+`o#GsWG@3>#3+B1R8x;E4rp($q0A9DAT5T00hOWgg^!bDU~ z85aMA&8A~um3C&3gPS!7RAM^*DV@mm?&|TtxTY3-3lZKdxEf5V>Kq`)tFG@_ZkBne z9&3fIUdhe8{IiA@HcYAeLa?DXiPw(l6KoK^M)iw z<%}sY7wAd{%0Hu;jxBxZm|>|!Fu#$t;+{2q{+I((=W@l3q|Y2PHZ^lCpwT|3*=Dh8 zvwfz=)8Rqdg!FoZ&938*oWo&MqzFq6jBHow@R*^g8`q+Mo0sm%&mP+D%H#6Y8G5j> zgPm0WQ$cDr+)&R3{IytS2>HhHZ-*vF2UkB|m0^eia6s@3ctiT2yu;ioS9Q!J16K? zX~i4KeVA#9qK5klFKzEB=5dGwui?p0C_`8rzCh;%!4S5TqD*=D20_5qT?Td&g@me$ zc$tDbZp{{~f0X!l{P#Wo?e&;HRKtH?^4snv&eIXV)Z9pgjJ$?h8C_ShbH<2*!WhCT ze0HA@H?dlpAdlGG^FoUo10jtz89IYs_vQJ)FFCeYnl*0k(7lzxh6rdWFP7rL2*Mai zlt#_lp5*@dl@kJyvf!9rOMSi(=>p$TEBF>Qm2XRzd=PV{&}JOUJt5Dy{jn1oF5hN3 zKjl@V)(PqNe7<8bfLU4PeA*x-W@(DEK|iYaz!R>}>XK?_ji!y2Ca|tyb~viVH}C_H z1t~GII_BJ~MfRddt+Psh_m%dX#rnIzYtEUbpI`04xJKwt!_QdE3G2r;KDg|hjXagH ziPC?}$Foe7eW*&bj6ON(v)?{7=DRlV$N0u7 zRcvf|`U46s>+$qf{&;{g=XQ-{hK$8&Art*0elyt-QRiO$uG9ex=TRwG>)fPChiFoO zC?NW|uhfn?GxVb$AI#);*muR86*vYZo@_rE#R$O-d#3AM%v|+5(T*A+RMPYRNCG`$ zRMX}wW4c5`ZIeH8my6Vx#}S|DL;%I&9TQaZstix@k2bOeT>Xbm_Q zDZ3Ka3B-RJZecoruEI^z+}cnatp#JQ3o>5Ko@$r-f=r%BEewH&5F-tZMVk7+rYFkm#@!Am(k-Ard7u z=HFt5xKlX4&eTZzBBjeJ*IS+B;nD*VB5jfTnYLKc)gn7vP;;07R&L2dj|Tm)lQK{I zU9P|X7%d}E56c!XEKo?>sxonH%b$5%188=1$CB<$$xe1RinCzWmA&9wiw`7&A0d@pC|hRVc5 zg~1}Dh%j`WR%-bYF}aq~nS;XnyCwqTW#-)2bzU^+yN%nRk2b1eCQ-ND7r}eKd6B)N zcwg$=lI==_KZ(mgy1{m6?WJTv#u30~xA_EC-`nPIQJihQ$0#p_hVkx*_d$t(Dmzz% z{%rJ-cBAu#Y$JZnN*-$+o$JCWyrt9o=P4eRirq#A+vi|_;=#7Jc08oGF<=j!o4A9s2e8oQomJrtTGRgo+&q+a_>GT<>U_ehR2t3Ov@t|NA$ECl8WB;OiXqvfe9kERAN8# z$c2grP!>@_htYlofhJfKYCgqR)l@8LFd+}9oKjRje2FRPXJY0_X->q0dnKZ|&7EbN zL$X49Q1z;&I-jXi8L6+Sh&Na(F^k#pSoz|tOat>7&(O?x(8Cw=A~TN4)D+Gcr~kZ_ zZ-n)anWHlU*b_|zZ$1mC|2`CoRZu7Q-(f2psJp#(gcuQ<(EU(LjbUCl9OLQr&LuP5+#C$whpH&)L znx}@F@{xH8l}JBZW&Q%&B)tOdn(~YQxWthscRQ7{c>vtc4C-pv8%B0f?fpq!{I^^s z^W~5kz%!>j5!x0maTK%nGh60n;bD%XU+maXe_W;AX2bUa&%L_lcW<^8ady6+xu&a$ z#9sJISR))bM=hWbBQo3JVl8@hS5f9?<0$}Qf>bhF(Hr|W9m{!uN;=Qx4`-{}p7yuZ zRU~O0Bj7p#eOay>_EQDG;&wq^#>{K`(wH!&EF~)$VN|%uKsoMY&iH8DbfC21)f=xq z5OCM9AyWVU89N*JD2wCq=j9R(IJiR&2pBQS2|=QwK?Q>f0s$5Al9)SNUTskyPgI0E zp$Y+e!E!#Lv{kFEwxX@2t*zF!iq=*j3fSUn{Z%d2qHT54XbV*V-^l+vv(LRGyz~#B zBzOBdJ3G5OJ2N};HNvkQSCv30~j`p2(Ykm-Xf8{0*-$T6j9_qh=Ak6?F zFB|bTA`tu$UI9Uy1r-(D&-w~wRb+3i6ck?|>{-6{g(HBH4+t64n=n$pPuL6^iZ+^4 zPgd&ioWAFv$;#_6o)phbFRE_IBLUeKvn23!J~MwW>N`4J5@wP#9`i@BGQ~fKHZN4L zq4gVG{8a%@-d~{P$(UZ-A(Hy8{_Jd?sd-ki@&ZXm(oOkqBvl@b$oMoZYJRyv<^5ex zkPUAhrhmzk{^JMf-{zTzp6S-Vq??;?7hTZ5mNh3IwEw{BF5};DSJ&@d@F95u&(^<4 z^Ih>_^Gs!TcqHBI`BfKqw5(b8xFqH*f9xc0xH!`lo=3WV?*fnH2|TAC1Rk4bZfTQF z3g$=B&1GHT(XyuBLE+iiwf_yFo4deQ2v4*j!J7lWb1&4_XuhuIec^5-EcB1yg5}Bq zA81IFrZ^#R~vowG(7p5*@l!(>~xl%q&oxWe+^7)1(KxeNa4XxkEp3pMV37H8KmYq(`{MQ zqpw>wu8pS(4d&Er6UlZSYl*Y3T1}D1Sy|DU5(wjy{X!AYV6H~)W_M&!(xk@@P3;qH zpS(@XE z`b8VLPl8|uTQ4I?dW`y;P&J0|7tFMVae-jcyucSpBXKfPBNA6QHP8({o0hUIjlIk} znP$@bWSE~g;H00K)`qbvudBHH(rQshZ~Qe3({)1-y;9j2DNbauh4@PuD~8HrInUnz zk?xrbS?zMvM4GYti!t_#I05uPPmNA2ww+(8o&WYyv6DF!=-8F*6nId)%*$bgf)UV^ zDoU$qYUE_Pm>yXO1iUlyMVk{PadF+dTX%MN1{{NY&32LK_+FEF1MjNTUn=levk7X~ zAXAtitVV-*~Ofuj_i~Gd`;@$*J^WsY^C^Z(b#8yK;3l%txXV8^PmLuvRI2TQcMh;_X}8 z@qz(iUdAH|??I>NhTYCTthGr7@^{Ai7g7Vq7hUtBssUI+j9GD-gIkKj5!gAP`PhC3e@DJ~;Wy*UiC)eml2 zZS6_JJlBegf>DIgA#*f$Q{l-_k|*awgwoh&SLvyQ0KPvI=$D99ORaSiNvA=#0rXDg zR~Ht-7gSvRE6Qr$$hgF!$-E;nSkXzO`o+y1)~TZKSWE)yWN}83c`@ z$j3ZfDL5Am0N`xbii|DUOll=l5=#yPFk$;5>@)oDWR3n)#B0c~e}~Jj^fOf*z09}O zfYB#6A0E&o@rP}qIf(FBSDJ@N!SRUD`roZW;*8SW}4f{#2Zf!z!z^kb^DXoA+dX%5F}t5 z9KON)Rmj#^&Hdq5ti!nZ-ge0hv2BNVw*I^bns+f?b~>pLPDm`EB}!8wRcJj**huy@ z@&<{mU^UdR&q}c+d%v6qAVBSZt95yCES`+j?^pRI7h~Q=I&?ypQvLsT5~bgHFnleuq?41i%Tt3=-LDBq%M zV%$E~KdLB`&i^YdGpHP@rsr|-XPf7tN^l-i`G+?BkVXB&LiZA;pjvB6~ob|_^XDa{1t7# z9TH~$5 z2(&zo$AMroLbHT6ZYbR%>x%Hf6ZO#`)^(|)W9A=Cdpi@C*w&KL8hq!jSpru@#~{R{ zJ!v6Sx-YX_$WbPyBr{qEZ$7nJ1$T>U?FX3(vDE$h*G1qY*eyJMx7+jLPBQfsnq{h# zp%m~$b`lZUiHcIHB>NgR<$+lDXIhCi99(-AW-fogCrhY6xddy%sC zaeuy%^Dg1rIyu6g3jM_T!jjq31p$Cqpl0V~0g$e@4RSVV=nc8dBe-C^0l2*L9}~+p zL8`7>o<2N~t9}`N`G%P*Y;`%?s83zQ{c8xCC8w0iKh(8Kt!{dPr)pgtW4I{T zDi3qz$?h8Y%Mr3l{_bfB(%mfHtefwzkWE(ZI;@>>sO#vqqUHECKa2=ackf*mxtO9C zp&Y$AT*44h>5~6Qbs9 z8kXI28g-g%13aL`1}4Ur^fQt4g2=_iDd7p{*KJ)^;%*hl7ohuZB{m~CAxO>q;F@yI z=#hLXUKVj`p96JAxtnB|GKdhvtb5_+@bRlJD(+nNo(@g6)r+{!aS0guJTnDK#i#C~ zeV@>$xV@<^V#+TT>;`ZBknIcxFWkhtx?M1zjC*uLQT15*O02K3kRx^x=+^mmlYD8MT!|7aM5OXnX#s z7fU(yOJBg&{6=a>v0lwhCZ(Unpzq?+Ev5e^9!#~MGkA;mWdXi1?ezfKY@WXWDiiP}d}1b|QFAFX!CA*yp!W^7&#`U#s75KB9pf5y zjJ5iBFsCURD+h($U$0xH`dnc-<^z{M;}aBD)4y18;pvEPN_O2&j0$^zK;^uew~Xd! z(8h69K@A_r$wPJ+T)F-WD<$hdUT=v}BMpZ*7z6SItQ@5dCkEZG=7^O=56D*o@?UwS z1`hKU&BCo$stcM|j*=|yBP|zn^z>GfD=1U1DRfWVIiWXCK@e@gO8XaD2cya3AdWPS z8Ua)t)U2|NA;$T=H4B~HrtZBx{KRh1{Y~x$6*${bX-(}8Z0prO!iEoIe-uAOJrHPf zZwMjt@uX(=kO# z%AiK`TekADgvx~w43{mLgNKHiH@NlR-&;yDesrj*|8sUSB4>kQ&bg7#An!hXu;>l!a%^N%T@Es=nNQVu0b{hrtM_e+bSE(o9B2p*OsH1a?F@`zc!m=&@dj3 zljY|L(eX4l`542N9fd*4E?Z3-HJPym!zHnX#6d2Rf6b*s1T`Y9v+LSF0i_Ag(C5TCC*R8?ALzr1uR;%@();8>f>o^XGRZCm@$?9!t>} znc|4evY-qX2M^-HK$7Idmd%&)TjnK&}PPx;$@zonc`vG%goAm2Xo8T z)o}%nJ%*W84blkv3jVBE6B45Oc=1kuocS#PvZl(>hhE~XC#}(BYpA8U?gPjn%B`qL z_M|FEtjE?VpbBImEs#Zq-MU=3ksseF?1B>XDT%Lj%#vFg=R-CT{nMU~!8q6a4whBy z@457oe=jLADbeP*HY6@;;3ruby>UaV16tJ4e|9d`7Ee4hQKG62Ge3yxD1kKS_OOWE zj@p*~sboe=Tee?H(0wU_p6L^U8s_a}}OI!)m?H77; zGndw+ZEiPZba>-4(zom=>81W6c3OP&_?z948hTfl6Sd3qZTv>0@hdkG#oWF6I~BrX$pMW2_eN zs0U1xcW+HxEgn&^3OIySpJf}oQX3qUZLs4Cj%&>1?!0ZE%mQXG__Ib^EG@0MCGrot zk>@-Zeni&nli2Fw!P$>AUfHzqQS&aq2N~d3CNoF0~eg z-9!4j!pifMQF{;YcjYB__jlzbclUSIQyMv_zpJ^yRU?HLgPYA++~0;QN=8`0q9m3G~a<1^xoiNGRRXx=y8g9Zs_+^+lHiu7?!Pp01>z?a#GQCzSTG%5gc*l)eTo>P}ztF^cENyhzCGBH2&pr^-z5 z2S9@pVOdoRqH*4Ctx;)&P*9D%De69PH8wQE%%<~g@3K2lOGxppYwd*bb)Hfo%MB|D z1Q3(60!A7V>kW?@wV|a4Hgrd}A&64NOY(r0z=2}K(DMtKKH*MktSm!ex<;Ei;lQTO z%QiJV5=F3)ea%tpB^S_^d}QPz(32y@A5VpNc@r(pz0n%AIWcw3vZ4}a7rSNL>^fUH zY5*zaVSa4QlKpyp8tA_K@~2yT{vy3L`SA`{Quo5Lf6273dTz_)vHOeo)mbzLk>88td-*5Z{DFtc@2B}4M;t1D z_gm6_UH>lmj!4LK)tPk-;;)jU34h3ckz-X10IcQBeH1dq@m&5*xqLy5-z_Iz!+fDW z-!hEa70wP9Dpndzq}NEoN91{sLW>5xDbW}n8CQ^ta4UA z%q(9AvhXpHjb)0>>)H#R3%I#i{+G|2}*J!@%V?Xm0 z$7Nhh18s5EQb5NrmNO$DVBuQj9J~99_D^i|tDEfIQWQemu!*NG?V#MMVV5kQs|_j4 ziAgfS1kUhzo<*gL+^Q0K4v1R6)2s_BhPg0GWSLMiPoB-an&wADHH_|czf2Bp5}zZB zZD|x3ujHI*3M16b1IC7h4BecD_wW4qxq#-ASW5l{*1QSseJp&4csr;RHk}`Ng;m2( z$n4*d<>>#D3eOdu6`U_%BO5@2>1P(UnVOInMYk&Xx0q$2-{|X&BY0~mCp`EHV~qGG zQkhe+BwH<;I+#-7-?GSPQ6t{|h78Z=zTPoD-8m$<>Sus0^UD;)%zKbG4%iRlHDac1-)6Whmf^=tRfN{)?G0R1xo|H<) zI7UbiZGI=YM_NZ!llJiR!si=;vPT+q48vX%xAk@Z>KA9K8_iQ?925&YqU4KA5I};gZe@*vN>x# zD2E-8$8?Po%jDmx|1DvfNh0 ze&1FqILm~Hyz`8xAV>|A}} z`Tjra2a4;t@!R_AK006Mr&*23h4O|tHf8Zd=;w1XIsY!_vqwK0=JgM%;h(nx1lZV` zYl{gU5L)c@4_zqKn4~ul%p2*%<+A2Pl&R8#iu9JwuI0lk#}?tWcVlr(7z{RqZ|7^| zmYROpu(E6a>+a(_^nZGu{%y*yCIJ7ou%&-Kd+^5+lbxzNnE(0aZ64WWZ?s|?uF1lv z4>xye1zo$u1?2HXPvBWoe^E4+Am06Sw%j6fN>qrTq8kYSzOVMVjGt`;|A?7sfy}f} zW?E%tT2*FRBr~l#Gp!~wZFFYZn9MXBD2~ren~<3{IWsMHXUgs;V%)6&O+rI9+?3@3 zLSTs2C+a82ShWWbyAl1u08=U(3WrS*n_oqLYMabR-0{a zfV7uy?anf3O*E?B`s#csW-ftVSoK{OuyzkX70x3ch^fJw^h(XGWjZW535tv}^z+WF zmQu)@H6uD!Sh~q}r38pQ!OW~g_76qnnK9->;7V`42oaF4eJ83n>f+k^BDf>$r$xob z9>uC1>b#S~(36t!=}d3ZWJ}4$Snbk!*1n4R|1PNibz6UJ*ZLE)F~AE~r1Y655CYNBpkM8zeRXsXPo1a^r zG9Kzr&XwQbhx~Hi@E7tNE=*JoF&TKNjC+$&#sBIRPqa`)Oh#b)y-CapvdcyQ# z=Z^)2dYRWKM859l)+Ld`EA^j}`qF3D`hV$C|2z5ma>$99L#6Z2T#-rGoeVce)Okpo z+ZJ<7E>k**Q{P=OPrBFxfNaRlu7U!+%xM&eo6%N=0hoDv!hC<9=W0yCvFUJgzp_wl zanfIBE>rq@uUh)U9ecjN9-IMomWC#JnJpBEn~k3eQxfjdAAStjuUB>Ii*-aoC+6x+ zLI5({)Yx8?M{!QhWlFEt(x_nhMI-SA^=KByq_$TP=?pjj*0)gM+CA1~ls5~E-&Q@~ zHHWTu?4vXNc-fgD6in2gAwY06kZB0G(NLx#Z8hreUlb9iM3!??xwN8YZ~W$(e@9?u2QX ziTTCDipuI2Fd)i}WfEpB!{Lv-`9{UyaNOq5+tXY=q8m|O;`VjhtiPSm8U0d2T3^B6 zOtkonhT>G;^u`h-DXp)FznP9QbvVO1>FHiK4>o;k$M8M%(|pNF^C5<6?lzXIC=>d{ z%-{7|=5u#+;^UvWr7m!;S(>t>*{`BZed+`kQ36Va^TgG6kSV}mzv*IF6IPHilGC7SnFQG$Od~F=cxG?mmF`0 zk)Hltuo(dYyf`*b3CB|TBuv(a8-K1}w~ub0&*9}MIoJA&+n73&V5sFc|NqbdG@u;D z?VC_4Z%VZR*O~B9iloc6t9wuLh;UBZxH8$slH$MXTxZuu`1UwcI?qg!cwoaV~_KJAar*>T0*VWqB$@#u4?&Wv){UV%0 z^d!t(hnvq&RRDFrz)Cz>t`Tl3tlK?pe1VpG)s}NayOiChdYYjTC1Z0Zgs2;eXq~bf ziZp+(t;U8jESDo2+&_nD#RE4K<&V-WQ5)Gf)z6(V8u@6iSm(<^<{OiK*`3q%(c;4U z3g0{9Y95|CH{CL(C^<>C1swS&`=dnsp^&I_y3ls&){pTnUpw4=Gbu7ZTcoGCz!pJc zH$vF-->cE4Fhob8K+%R08cmO(Z61@yoS4j6y36ysEw=n5j0=aGJ8WUSyem7E@A5Cl zDk@~mb_o65`q7Lu0Fd6I&yU)X$B5awz0CJ*-F)|!zZCg_eFUi>PeKXC`Bw;nJX6Rv z!};fd02(a_rz#dtDnwo_Wh~|j@P&o=ky%5+u0!pU~FxzT@0PpJ9KVdUO&ce zhVqb6UaDHa#EbfHGt1Ud`Yae`j=*JqNsmSNDeq^J@@l6m+t$R=#$*yr@D%h2kW#Jt z+RcN{7{VUEgFXIB#bK6Bi^q(AE&$BWlc_&MgUpMVumu*%&cWIk;whiXfI)+gC3{aG+smj0|?Y8czo z(HMGe6e6AEJjC!B^<}!9B9WxKnNlN`I@w(~nQeZc`+})PREiOG?@c>>u5Yx6liJi| zPa9F~O8XL48%O4Mb}H(GlH_hcG5LSk(v19cxS?j=Lq6zVW_9|u>}Qj+`9 zEu;9m=KPP+pOgo`A>zQ!$eM>f^NXV@dR&7+pt;E&Zj7>r6^6CB#R`XjG&$rG=XTb< zE~h&od(`HcZC(L)+nNUJ|86iAX01C?dq@4DBW5#2JW@dm_B@tJz?sZmul_p!z+k9Q zC)1@}saj3j*B0O0PuhKjc3+69a}B=Y2kdt*$dhpq^37~>2S{7)W_+vVpllqq#g<0Q zfWPyC(sSlo=mLW6M} zFV^T1GTj+tIiNWXp9|i>nK&2s&&sJw59*yuHw-%Y*GYDjilay_mFZ7=C0kl1r9VAl z#aUo?2<%QtDlS(}mC2w#S0N*BU!6B{5G~C%cCT$rOV?xA| z@_seywjVCMA(N^1LowlqCXQ$@gi;VD89nPU&h9J#j!wi+`O1I>XWMUE-y``+*X<#@ zUnZB*um}PcrdwFHr&?2fP7HmC}j~=jb z^Ry@m;0MD9@^6&`7ip`-j~roP>l#HTTr7OsBU+bpE^!3$C9<{x%lkR!kzql)x?OHA z>wP#v6>D3bCtQ@xb5=_mJNYGZK`U{CU{~fs@G%EZWo>c_qq4vwv@++~v-rX2NUbkH z;#Ab6wa~`fS~I)DYV3{J8zbkrw$srt96b3m)G!pMe^&EVl_=*n?L7<&i?=zgP8 zBHd>jaxe<@urGQ7jl2!^{k($%%$aDD=C&~|Jkj+rACj1LMe2;t)zeuMWexRS;wc*S zw3_t@tb{x%+wLPaUs}yB=k4pl@ND_7dR{zGkY@e)T-PZ6a}(D)Zz``+yCcz4EgOG7 zgoT@wnAV|jLsKK2`%W(kISc=T^G@e)_S!aN{*xj3~xTOF9XSqV;YZ5XD$MIBZZ;Cx?9o+*+suEJ%kXu)>a3%JEqRr*fzM3s$H(i`c07*001J`f z3=Zsa$R2B9UbXwPP7hFq6mK*>Ex{dY`CH>!{HY_v*YQFH-M_V7E^(fWNcVGD#38c| zc(ZI`jy{~tIbdWPf4)M&4!hn3&b}FR?knzzEHFfHKIq;-4(`D(TX05DwuK*{Hp(7bC>u#ZWy;DklKR=zFEdS zmdO(uM!)$xA(rG!VYXNF+*2kC5tp*Wf6Ug$+3JNp%;|mEI+$6&PQTDGV%!pc^4OS} znJt+dV0%~8rYzf=S>m6)b*j>{a~fUc>G7k1I!opjo{q__Cp%-=^S%P4m25^Y^DQ!9&9#w~^3gPMlr|C(jv;Y*zU*a`b?e9L z6k~mNrOjEMt@YlB-0>u59Sc(r`;ezLf-dwvBweXGF=l4+ zMZUbF7aPr%Q9e6B(WRq2#WJ^EUN7?#^6Va^Nh!x`?PP6D$Ewdv^21$14Yz)R9q!TA zE??^|&({5T`2QSnmA#utJ$r-mx_vTVl|eV%JS!5|(>6iI9Y`L*`(G@rS!!_iN*kV5v|RG_J#8hDvdNcC*|Mk2Cn-N*)!8z?-qRM6l;ym& zwkh}TX{(YHw=A2oc2Ao>i6jayEw)Us^?J6Tu5Oo`+@r*Kuz;%y!cfc^e<#LGop_su zA4>I?P4q^8Cu~5@$TjBNQ;fH|Y>|-evtqigOpl1$W|bb8Us8}irmzdIJ}Sgq{hEX1 zBV5Ym|4_W;b?YAss9b*JAoWpk=JG2Kl0Ts!KU|papm!TehHEWftD%CFP^#;>pM<5wSoz?ka6{F*eTxTt;q)Z(ICRs8^M zfzS%}Y4ft0_lgp&;GfMpjmPH}DNe(}73$9T{q9QLOVEkg$ zFXKN|#-DDXt_VVHU3^RC>NeQA_?Oojvh4PxUhHz(S$TlhKdx{O=)X_*{wbq_d(|5p z@O%2N15_&o_^1?oY*MLVcYJ8pa9S(G2MS(`4@dD4>IFWu;BsYIy5QpsOg0MfL0yXv zsT*_hbtl@oF|%5091b7azu=>L|6eFeQqVtT6tHK!!O47L_>h})OAl2#e#;c*vJ^j# zW+6N7GJZIGJN^ZB{Jj~!7F^!FfBd0oFrqv?P}h!M>N5UZ-HEm?Rw8l?;88(+tEybE=_MFGaE1=n=%5Bk^GZTaz1 z*N#`}LjSqC4Yn@y??rn%^mw&@8E^Og`*iQ0G78wM-r($bt7W`zTXwbEcr~k@(uL#Y zW@^Wq)bZ{Tn6==&I9E-h0@r;>TH?JF_Tz>0ONb5{uP(q*S}^Br}aYoAeONBS*rL6^#wm# zaQW^7@N))Uy9@C{U5g*73;pNnPPBEQf30yi{AmAzpYHvCp--C&=7%y0n2ndlLw8;O zl{q5FqXj?f6!+cnqgmykt`I*}S^O+h{EQBQA1ye$JAC-}lZbEy z=LK~wexz>9$=5x`){PlQYaALsQD=<6yIb+u9bV0fF%%20^3!g8gqzN2eJ_m9uOd}v zz?JiIm&+1Y9-J-jlrd=KyVZv&Hh2dd&fv`QFMB4!znBSx!qbsWwjG?P9rz175EmI@ zC)1^av9^PlS)mQsfj(uql>Z-ii@P@0{%@tpgTrg*SI4#PVED5163Nqxa8DBjT>`pT zUvr=2&8t}7$^EuWDzqh9oR!R;`e$;UungHdL%b_Nt}P)k+y7XZuZcRp-RDcQ9we*F zd{zI?`C8kL`O?bm`keK!^Ho1V=4eM?M{^L|HpjYBl9I@qw0SW2Kto22b(WEYkx;n=-cMu@qgol zXy*XGND#U0#LT=quveZjPXx}D$fd418>9NzJdO*VnoTAT#9$>qFTD}@$C!W1i?P4~ zONhF%UyBWFNE*UT#k6^is8kwE@qeU>HHpiQk0M;Fx|6qZRt-gk%RyvunAikuh<9VniF~~Xs=4zi%5HjHA54m@`S@whMr}8;+}lNL6GFM za*K2psTZy!lEyrv=Zoj&Sx_+TZguBxb9+ArI@h`=HAjxGnX>wm4aio#kkSx+>bJmv#E5d!oGRqK2%5==t zq)4`8@+)TP&$aSy{3dGUOLB z{=n%VOORk=>&COMKplO}ZwN-UYU2a)JsHNQO|!<90})9NgqS%(qif(5Bu@-9YURnp z5nw|Z74kSaabi^7Jjhj)+kdCLd*~c6i$%bY>b53(pkL#Cgcw|_&jGHP&M7h?$=-{- ze;9k{tDW(8vE0P-mLqO{SZ-|tbh%kcUbqeKBeYy$p0Yvku-+U=k75oWfXGhEL)ZU+ zDuzlzl|)_;u`J{#ufoGj&Nr#b3yKzB;zR;aSqQ1P1{W43?%&+2{ZEeu2yA4KsHg|( zR8KsURJZd~qv+`>o7G3MFrP^+vKBIb<$;GHSDwHoZ^BcAQ$b1mqp4v!%?De#nu{4E zR&CZ+CP0A(lg<~YlLD-7p?futX*8GSbB`joy*)S1)L@2F9W`Gq>^azqfWPQzp8)ys z6Cyhm59TSt$UOZyD~~a8m9}Y@14<3OjYgDE5p^V+Df!LGG7bgz=O~@%f=A=UNN3o{ z41QQ4mSF3*$?5nCsGj5egy!s=iIgfkXTh+}S$l$lPaE5D|7^z+6XZm@MN4Di52IrM z2t)k7L?5ba@1j_vQ*r26$%BxnJ_y-LoFA|(4?^(O*eQEYQLy!MkybzxoxxSR`6wvH zU%*@5galjvL1Lcb+uqDm{6N7r#`$wKLYyrBRS!!G%wg0F`J1-T{v%T4aji&_yYSCG z38oim0#0l|cu{iqNmNB@ES~d+Ij`g}BksFY%L+Ard_-C8DJfw92al=pG>4Tet$$*+r{CR2H?U?YD&*8QBz+y$-|gY3v} zekyb0){AzNHQ3=-**_kY?e`to@6~+o>qO5e1IL#!8LWTam)P9Aki))Dj5{K=a$fx| z(yAI`$`P;bsueiu_7bvlV=ix^^EjWu?;ZUte)R!YqK20%J;tgHf95P6j%8Z>nU+AN zC6s9iXId(@)>m$)<*oHq8}*OqDT~bgpoM_2_0_2n&dUe(P)iRn(?{XO--A39bN(+^ zOk~Q}cJAq1H(HLTW>fYjL0bjwm8J%`eIzwTAkep7QEX;vF<5%5pmHxWhRQ5JVj1Dp z^2a?Chn_UB%ZoJc{U5^r^qJCXQEd73PG|`7Ks`3G-ad~$R7soOFZB3Pwi|UU>imYU z;OkO-kR`%@LT&HO7Qu?Cr}^oAg~V%qd3okk>Bm}_>V$|=Xq7EwhZ{EobzD#x+n_Hs zs40%eh=3U_YgJC3naMj@TR!2~yB#On(=Cw_0_oHT+`ck`DE|F!7lL9l$R0%$DQZq$ z=f^Km!Z-07sboIDzVx=h_`T^sAd=WrR2>BxC6z-@~^-3sV>SehC>mzT-s*U z4$Zb5$6e_}$cp$wG*nzJL z&SuC@N!|LZ7q&&tKY8!hyTSZ+jZ~_blc_6c&TXo4OWDBY+@>u;W|RCJ480pNH~3A4 z8qSN^MiWlQx#MmKr7m%sDz(n>`8qx#E*BA_Q=bZ*DW4XfVH?TZ;4>4Yo%gcsSSu6@ zT&B)M08hXw0O|>Zu*5lAvn(?9!ylP%zYH$`6KaN_`<2tt{1WvYmm~3X6;{8H;^GCb zN6!`Q?KH3M+ask$n;rJU81ohTVXV2rei&~S@}ZeRlTH2e(D)rmfdm1x~{h7r+v+@=O&=XOz-AJy|5Y&m`nObw1zA&tCzfhRhBn9Hap`>r9C~7&o z*$lO877d?5QgO=&r!v>viHXGgR7;~X z{)k=DW)ASh;?1@`fR>w`xuH}^o1ztQGkLxqsXQOUs%K7M?i{RkupmSGUc0ewhy6wl z_7!u<;fYyRx#9ITSbK9j57uAU_V;#4L4U7))$5NvXWSfo7G?Y6d$vDD2-i`vBruo9 zY}x*7$Q8kZ>ebrsmnG-ErSZOGp<*ppSTB;RCnjokS>e^AsN*UR@M#A@)1unAskH#s zwP72Q$yQBF>^Rk(!6RDsrBhy(5r8SZDq*Ch7S}nzIs(qOa@CeNzqYIRi(a{NX=d94 zNB0bU&QHIpo}mT&{E(kN@N)-0d49duAA~aGsjOINud9{=C1#%4E_*3EZ1NhnPYr3@ zb#~>_W;)SIxmyfnUD#6RdMP!zl+&FkeRKcFr5u;=#mxD+uLGUYU^!;KluOYN9>`;X z2vm!bSLBa8DkexS&fyP(Kie|0Cbz@-e6k{7Dk}O!&S^SQg*{p5-9)cJXE+t1$l^xi_F5Y~z? zgPwd~JcP7v0l!o}aO0*qa$M_f_C(<*twP+t?k(CeBd@uibUcu+v3qEfv z`22an=h64%>&`Fud{@Ee?FFBU?#-7UQ}7wsL`Jc;1nBzmGn}6x{G7tiS^UKKIgg*O z@N+dkH}P{lKeEP@zr@GiGii?3eWjhHLfQP1D@CeIPO~<5%DkAnYwuf**s`bJ4VLZ_ zam3>%aO9h-s1^|mlJUM&&l@ibb#h7Q7|513#UH$V_e$>!_TF~mJG+n>_x^*s^@NoSFEb;Q zT#_~uF!1G9kC}S7v^AR#Bs{@R0Pu}3O^#?bf91Qt;~VcwRxpUFB23!ZM%T=#l3U8q z$)9v~1i2a6ga*^+Z1GtbAaLHFfc(Z8A?eKY;4@w595a6E^W-L0C2wwG5qWbHt42q5 zOAX`K`^Mu!=U(a3dhaK9_$+h<>`H;!EXp}${{vu z1cw-`LbLnF=%#ib56j>Ej63fpa@`B7GJV~6B!dr|snuNDcf8btL2eUyryG?JGBbqwF@Je89p~&4Jrc786q!Ft!eP8a|9Z^0(Uax zxCE8TT&P2)?1Vtang3q^d`GI6XQozR%q7)vyh?RmW>2lD#no8urM5jfJlBJ6r!%}~ zXazr;_$dMhg286@{S6f|CvC@PT~0iknew@8gUkKylIW^ETc;TEx&O*dGj4XQ%u+IVGcmfN!7lEgKSrTo(F-wV2bO1~3y_xAp8ruqHM@?EJ> zQhT`D8~}|?jWp17U;`_&4eY-0-A>j%u`p#RbAvd#ZujD{C*;eTi6G0EOQq;D?zX*e zq~8vfZgQLbnJN3+bLP4G_Wq6DOZV{#ZWF@5MpL)K&QG4|U%}7;s-JKIR1ZGiFT&D` z%70G3^LZoJm}xZ46748)+uRHG5#;g(q4L*C-!d=m z;RipZTYzO`D$Ham{HgD?SJ0(91^Gf%W{}IfZhWTkGA{1tWoc$=z=NTApZh}k?av#U z8qG7rmGfYTN?$MNx)c}|craw9d_-3;o!MI4MsBsW0Hdq`26xIwSayO=gnpnq z|2)7z6m85SZHFlOK^g#qH>yAaT8m5KUq|RL3-Jch+$rHvThjYNnJM8##{>QUf?I;R zP)CGX^1Q;m;G?=1-M#qW><6+NbgT_*2!8k6K<2^#;}B{&C+bcm>?#zMoO+y`BAKZn zvjSM-ard<+z*doY8>Rb=7lx#axs)84@y?q|ZytEcORM{>E|--{z*SZr%PRF=N3EIA zrTYC;Hz(M7H+4F$vigj4_F&D|8-8&tV*UnUwMh7Z0C+;|`ptx<@Mbf=h2rUd#( zhS);4$^;apHzB)7?P3e>k(uht;NWnoRnQdfI_Do}cO4$U6zoN(dZ}yYjfBVN=bGc$ z<7?ne;BW)!{e;BfneDRbwY9IXQ!D}U^%Ihp{G@0ZyUv%>JCEkQ(LR4FTDou4E($My zW7VFfmXmKr-uNUdS==~>%{jKx$+pt*QmMDdY^zouE!7C3{->F9k&$BwSY%(j&1r+b znbW2+%`BJ8!yG2X^5&MS)Z%Mlw^C&rR`Vz7tmL=j@C)ugM@8mqqnZkhNu& z^H%r{m;yhnh0l>Z5gvUn}wi@xoeZnjKS&n=`<-fPEPd%h%g z(?@QoSa<0DB~SVvbddgSo>|bne@Qp>UHjLvX7_mq>wnf^`j-cS+c^~&= zUB)lzW=p-K=Hka`S##|{``>n${v}Vxe~|udo>|bne@Qp>UHjLvX7{-V8-L*bL*rla zbo>hr9KX#o?>BcFzoeTjQ@V^_%bIHs+JE#g{Y##X{~-O_JhPyC|B`O%yY{bT&F*Oj z8~^Qx>0k16{8t`0ew%0Bzo^^zCEaY9+-3Y))?9ng{$D>#|B|QUKS=*J&n)QPzoeV` zuKjCSvs)KM_w`r#z@g_~@^t)(1IKUk%=_?-UFcuZ%@*sUF1!A7x)A1jqf176(bnjo%O?}t?wXE5#i=zAZcOIsH$YD-{zSG-TRkxQ{T0JEo*k`qUb*UWryis@^t){ zA2@!SXWox?8^5HREfczoU(1?n57xh&k2sud2&jjkq37)HayoNi8=*UAu>%q(XhP21CfWVF;`#U?o zA?=~%K>T|1Z}aD1C6KLY|8}jv|Lg!JeS)Cs z_-25yZtxv2zo@(S0_I`o*N!$sF+0B&`gt-xI^XttbV}FnMN(ep(?YXW@(aF4C11va zOE;3+A8~Cy)?@m8Eu-r`zhWP7XlRjl6GK%rDF{U-^9Zy8wQA@8sWFed3H}$C2WJ46 zC+9Awmnp}A)eJCFC^fd zv@C(%ZWS%6quxJk%dfuMrRC&e)qjVYxf<2*4*z3ygO4BmmIiu237qO}ez_hWjS^n) ztQbM|hCQGg8Ml;^n#^fNTGPl>^86lgiX8#Y^yViW}AVszeDEs8ozPxbVe|)4_~y znMUMfzCFW?b98QebKEw4zv_)b>4ost0llE=Q*`wQ0e0rfr6-%OkGa%sV%YF{i#}|= z`b#4E>$CubLS#M*#hqtCX@nYaoAD3p?qYdr2Jt({&>433E$_RkbNN7Ux&eVl(abi! z9lBhY;G3+!)8rWE8s^+QQ7U*ksM4bQiEdVzpM1jj+^I@5y|w4Y#?ra>wV)5sbG!qWgf?_ zLL-HULed-GY1xQ8Vg@uaYUT&MP6;z*7C0<5R4x%ID<^koAc%mW(I}g%E z9)+uImO3Aj{nET9LMbC5#!BcxmSEIO`cJl-Dai8Q7R;h-7yrxhJ~v%QqBvkOz0plD zl~a7dRpz{rD{D@Z!(d|4Q-93{OtC`BG`~i*#=GB#ft-k?+$Z zwPvU2G$FND)e=@nZ7}j5s(~KtpG4RsN_%mIjXLWE?>n=`zAKZqA%w`^Y{4x|*57t( zBtVh`j+9uM%@Q%PiVqTdq=vt>A2i1?)2!g9%FMtnKHB80R{2rCj6l!6y1Z{9hRn|22*x;_R`kVvu~*=35w|`V#hlm7J6{^`)ji8@OmI?{9H)pb z*yrLU=0QD(t;Ir&!%3JVvgz&#Pp@n{JdV< z0EEiK0t>?8_JMSixXgaLw%yOSm7KUmn5k4IPjru(k8N%6vGS0A#>p%Twaqt<qUM{x%R~JY~8ylM_`*&-+aKc zkvy6n!dsBYl8zkLW{0wEr{2Eti*10JoN6um71~9Kg&gr0waY|=Whet;&PE}Y5)=G~ z&Q80mrnvKKVQFlZ&wTXv&pJE425;d_r;tS4yk$uORlu!3rVjYd&)g98HxzuVZw~*L zgM2}ChwRWhp-89d6v*=KUkX{Wbb!8sc$(6ZMeG?0>Q9V<$`IKlXH8^tzC~9A3Ainh z#U=4Vf7Mqa!pLfBlQ>29SgOPPiU?Y#=fJ#e7H2p4!PcdGu%R*)D~XP8>mIrxO7G@0 z8q2OnLJZQ=#UNVaD_<>z!_@iffrk!$5is=O-6n{u!zF*}YCHDGOEt5E7D_bH* zfqktayAeYRwiZ)o3n%2p;->?*5LWBsywSU`#*s|Fj;g0Wl7L%z6Zzn(KU#u`Y?bOo zE61K>)#odh7V}Bor{kY9aZ;2p?SJyFIjJL@d+-lniUnX?$Y)AAf-&>qc)n?9jVbxZJhhGegJ)@@DOOikxB{pe5t{*wLbKI5O2U-4sRUgFSn82Qd<4Yp*DPhCSR3-<+ z&5`?{Y$WCoJRn8c{N$vj8Aop_Y^ooki9l51AJ3;YFS-_MWEnw(dV zBDE)D4N}f;L2Z=?mHb=`+@ESc&^pd4uC^tGv(56e=DT-U-YGd$8i=l$K}dx=+p`2s zr3?jVUfE&Bf-f32(IS@8In0aT$FT+69+`z+Op?6Oo2(bVy7KdzojhxR`*N?7hs?S5 zh$N6aN8A9U0_Mbrl)0hpn|v zzGH7rtgpZr7EX`ufmdTHIF@?o1x*a}&o$=*6y(KS<4mTg3h!Ax%#u@?x7UGO;^cjm znTYYWLRVGl6niEp1XmNXbA&nm9RV?n8=D5xS08TpwoVlc;k`oHItff8N`99sa03q_ z*?)M=5;eOq1G1XJwms~M#i?n{akE`*#AOD50XUH+o<_W(H~`lzBU}ltC*K*w{aTXk zJK5UA!D$|~#dsC5BTxR`{Zz#p6S)TJ_n1cI#AW6795NRWFm;5P`?d~6$)j(B8Ep@i zGp}MP;h0Dt0qDRTEq!vnwE2z1$c*`-ji%$rimL2HKvO`T@^Ni#bGe*aIc7Pq+6nUV zi`&q) zU41$WmImqDkz2Awm%TA}rnbbL0J z2RG`N>6;}?#t60BWrD$4UoQFJ_HRGd)c`2Dpd6JFn6gqLYn($}*>IsnESrdMr8{7D z9ZCuxZE5*F+$#xO>z#!3x9~ zlI9wY+$@b%8bgc_ZD{!rrzzL>3T^1Ax3Ucp_gDmFH$lV16Hz`wD6OwEH&^9)td-@^ zeD=Vegg>h^Ed@PYo~yQ8duq(~gm5hOO>g}Jk;oJ*HkN6*xNWKK@7r%Z9 z=@)EPED02XBk^M(t#K25*qciRYvtUmgNE4v%exa8pVNNo?f=OMtOwbl>&^YVe-uv4 zm#lGQM=+O&!?Tz#Q^FNFy-}=yiLb{7$li3?1A;F$*i>Kq{h;yB-6lA=1~6#07@RTzd1BK~%4qDjeGE+dV*ot^b7( z7(fk+Y`~hhuvQcDnesA8;(vYcH(ex^4bHrixL>T~mpNC3A8ZlAKdZ$Oq~Xr>Ww1vj zd_C8uWPddy6q&0z5`|-ClCNX2$nREtkg9g>BiX5xBk8Kd<d%mqC;eF`Vy*G$vn-a6!}jeL>$CGPNcJ0ol${gcRDAq? z-3LIgoPSJTz885GT)-|^e?{q*02f&E(hu$F8jyFzu-UTLg=o&nHCGB7YEK0nPxgpC z{SSvcVmDL?Qij7U=I=woq1G@*qeb{xBMi}a6_SsM+RZ{dAo>UpWcQa7tRGYD@alvE z0$Js3tS*--N7NBk|>C?966gU_JP0Z+?uL!Y;A1 zk)<`5UVXjYPCYWpL(h;KY;@zO!=`dE5nx{9$#T?eQZX)vNNRv3DGxPo;44f}!`B*_ z{A|ReDkjJB8~H@By0dCBZnK5~fi z8zwMG=DPj5iA>(=i}1Awt1#aqb9ezcIU@0Q<$GYQ{T`C572m@ldggD1h~4>HInCx* z38%;R$Y}e$y3BsBDYD;3iwu$cF>lV+`eT`V`9A(BzOV5`7+;w2aXp_XeOL7+NghtbRyi* zcy=VIh`g&o9?_e>eqY-pD&a%yB@%U~3TsBFFX~ij-R;*&T{$B0Hz({iaol$#FLKZK zx&0fU(WgFymzm^`5)bj4+7|nK%c(q+LrJoh1jzJ>{S;~P<79M&O}OiIZVJ=^3NuS9 zMF8NBv~Mq!*3*bxRvTnK&2Vm+>H=R+vx>NTgRk}j$Nv+Vods|>3y=dHtEiLx>egRF zMDhUgVbxmro+zaE;$W*t4%3_bH-4f-|G^VN^w9=q=X#mM^A`(77)9{bt7xX~i{yFE zcFox|T5`05Cg~u^{C%)Idp_QJwxkUrKIJY&spaacoJX|oDqA-TIZ%T8&r<}7=QwQcj zT`#q#z$2yGi;@E|!cQH?ql1JH-%HlEt%GnTKIiDtuOm}pMnBywLn6e6wlrSb*Fn$G zmi)}N$jUblalepyZ%dK6K6#;f1=sedGg2AL$DQeOYBYC+ z<|^>(q<(*f_s9R{U|%C?lUPv6!R#(7q<@~>mxwc`Kziv0-}~L>qaptAWQ!HwmnkEXZ3UEi@x|y(!s~m_)>S9 zWU^P;gzvv9D?gws|0`NoS3X;u2;hY83^kaMJAjOnz%pGZiwjMPEI%|5u~b)nNW@$0 z>FB`m;NVLQq4!HVlm(Ko;=f&KsDh?fV{FLBhBS(FFK+th7 zxqHxYFS&cragvKi?Mn7twMX~M6+O61ca-1?e`E3lVfJH~>YGwKg1Xm(x10qhM}UC* zn0sW$3`YY)I~&j8+s%LXSVVMTXT0QqFlkCkPt1ezI)|V`lCU|2pQHf6DK#9SId<7lN8Sb)s`hZm>(Z zkBl(xi*~TqasZ-|xZw}dUz$Mg_}eEex&%)ZgpE5RxJuMroPFcQ23Ot6$7XZG-@oWo zzhspS=-Gc)=dHiwFVdYpsd%0rb<{Ugh##NG!PO&nyVhFH|&`UmU|4Xf~&x!5V1t11nP}a9fB6p^rKQ zyi2sJaijKjT?+GZ$z9+*H<#Q6UPkOKh3f25I0jg~5JtkPyPLcT835BJ6H>eJV7Yrg zw7HhU@v6MzC5rcy$L{d911>&svw?4}IFD#H_rh@L@!K*$#b0Y|LAm%S@@VTK0R)=( zme*b(b#C8|^$pJl%Ab^J5A3P0_9gi}x+?37!qFo~*Vg4ksTyG_pI36rxwYWF7Aj#` z`J)};|Y;l+%hsz95Ib{uNSmNv^%`t-yaKRR6 zC4Tr)fvX&NMM1xkFBEJOAk6Zf^RSrEP2=B3cZ#u4Wyk$NGY+ zR><14VU5WW3jmQw#F`qSanXgFwb`5QiesD`C~Nn;>$L4w+x8rGS#2G^0;%46+w{Rz zY5I>LJYJ`!vXSwO)KveIQ!vPefI$(mYmrCXtBWm{S|Dsb?c%nyxd6L&+)U0YWFZB>j24x~q^U#-^@^1Rf*}{+2x%6)U$dnWTO06klBC=Mh|tM9q0W z{2UT~-Mli&&d-h&SK+o^7eb2AVk6Ago>O>P_G;>uY};eoFX1)m1xVA0bDV>yp9hiJ z%C(C-^F*_4>pE$Rt!I?inyOyY&m`Nt8tX%;d)NED$z^^d5?fJ+4>mdqF`4@4?9 zT$7#R*#%SFA1#Gz3DF+%tir`aif2@MZ1J#?s- z3V2}QmTfFr^X};d^LuWa&Tq$MEFi%)tAI&O5mTPKYIfwQY4~?fO^TbDYbk9cI?*M3 zim4-usQIVb$cay|u&g#Wcsth;$+wD zZTq@v1Q$`Wik(SlLgG2wln1sVsM$a!R+Hc1GfPCOu6v|H$~PC3w<(LIe8pfbe|f&V zhz|UF>MM(rCu!7*>AzQnY5J^E;%Loaoz#)w#)$5IihQWAh?s&K~>qDZqS%aw;@h^TSooH0@=GqTnQ!1_J&#GUr;3mPQRGWWn zQJlHY&TdP07DM)(B?Rp1EKP|EX;$vQgs)<1G z_vP3YTay5S91Cw`J8-mvt87(RSuwnMh4Dzp_GMi;n&|bSzb-L{x$Y;=^l3VqhTcLYW5}Lz))^D%$WQ zOSP!>Im1H;A*sA#+}n2n!7o9#lGP1nVWspfi|9zlr~9_h+eC!))h79j$b64yjZRM`B=gsEp6%`X$%ixX7Io5I}viZP;8gn*ClsHYN|7{01H&Nu4cE4-hoGfM1B&aGJWoDgNT zY+}{%WF_3OI35eQ`?#|MS(s}@9aUMVZCEiqUN)Hp=nj~`@0pBFh{1t`VF}LSD6V6z(%xe`r;*xnMUS@#d(E950cR$lb(Kb1eM zar^PO-WL&FFh8ObmUmh5+9k|S1wXoUP+Q29@s+nva$Op*CLFOow)vJ4d5egQh{MV6 zt_-Q3bpZ_6CLp1vX2=W8x-nHghibFi_ST1m9ZL3%Inf1ZM`tSU;K#15Dc*oc?fh?e zMAmYe#P4v2j=Rz?w$2iy>umC(NDs39(UZ%m)*xc^0k#%m^cPf#NzeUk&*^=g$(ej@ zto=Y35@cKLH)VU6=61SgrB@K$;ArW;!MsJ58|RsQ=PU3(QdKsYLAI($m40sP*1f)L zOGhsb^NzCLaZsR7b|-RSn>&+XsdGQMR|UwJBMe6&hL|hgs#oARs@cV}NAWc*ph?PM z*$tVg;bc!%%dbkOE>|*vfT`LHE+~0UIK30y{dr+`($D>zoKg<-{3NdFvZg`dE>PKnOikgxmy14R@V;?T4UPNeI z&^`|1sM*TrG(s}E6nL4^UW@~m6qqWs$(EIGp=&-{ z@nQ3E-gnr1Bu0nL7yjU&{j-LBDx2`&(KSusEc_ZnrR(=lxANhF?_%F!HwBqLf|{37 z*DV(MDodM^)NXg8H-R=k*_TW_=dyq^tv4~FioBcOdTUJTxP z7oQMC1aFm#Z5kg~tHih-+XNv|=NeR2?TsXC!4mcCqG0P4lIiiaJ=__b?jCEK8WsHg zAZ{y-YWXgk;5fD&jPYNS)1E<9u`@riQ%((doEc%vZ*L}m*6h`YrL)=J%w@Bk9hki+ zmmO+w!lN1{)Id4@!G-@2`f#0TIY}G-Qm*0o z+VFRC4FgJpZ5ZuxW5qJC6#Q93D#uZw_p+=hf>bFH#jH}>^kbM7tw0#SFRK@jw zARAc1#$7ehr~#s`Hfq#hhy_A4mbu?Y|P@9s7K|56C@O; zw7_)OPR;#C%ZWO60xlV3?J*fU+&E4qM+-JzTtc4n>u|vYs1vc=dEO+~$cGvisy!>K|7XoD^&S0#&2TpW4xX5aF=}Jk3pr1 z62OuB46L;2-G3;b+lH%9Fz+k^g&l2ZTb1I2bA4=#u3d>>A#;Gyb3ZW3!+ z&3{Ym$Bz2$f_qSHG<-E4(`d%P;+^dHpVh{&l;EIlRWF1~Y@n}Sg6ml=_bafTRdT=j zu4k>>uYv1XGxsaJo|Tj8tY_VDXG{R*fjSk}-n#3ZEm2M?!xeR7dJrpG{(gGU6L`WO zcz5@Rd$1e;NzY*jUb0qAi3Xc_v^N<04Sme1E*aPdx(4g^o3mk4I(2{_^8#|HEQzB8-gANyQdO*4pCvhJ3x?E$ zC?}0@e)H!Lj5ShyBtwI7(Pa>BbX~EHG<5humisVGSld@58x}ygWe{qQmxjjVY<{og z4c1x%G^sD1$DDTsrC;;_*pE1&0E}lg>Z7YMaw0>4q@x+Q)NwPXd6PIx0i%>#H_s8m z2jSwM$6g;G+(E2UOp3DFA;;)kHGKO_0;=Pg^?WXkoZABy)^Q+Ekm02po77c^90dGixmzP967SEhW~EzuCT zri!u#uHvCcdz~=X(wxl<y(LhK(>Cqn+9(F=ti>(C%sKNF5DMk*qJjV{JGA_w zuPC2!QvY7c*Kuk?ZjbsiT-}0=DPRt_{*qP=?X~=SzM_1_N&Sltt-p>_r9I1MxayZ# zzNA%;eA#RLA3Z$%ix4OE@1=Ylr#1}eS%2hFw|tgaf5K5ido6$bSCr2#yTf zY0vT*uKHz`FKN{yU-VZ0wO>&_5%Jwj`3yt33~kx?~eYJ`4`Nm;|>taIG~&D zrzgZ(FU5B6L|DCn1+=(27tT_V0VXT@G0sN}wmM*}S%vMe@@uR%yyG64G65@VD1Gee zY69cDQ}^4}PB*c>WW`CJWzu^c2=x15=DWhG?6<_iKYM}x0P}OHt@* zyNaLC-&p;*LC$U_?P?4&a6`@ou$TmSeQU>hjsF5U8Y%c=wwdc8hx{b^$jyb^bbq2g z)I<{K>&_i0ryD3@jdXa0fl^MIekP5kXL6?CH_fgl*m$xZ2J0LzBlrMNUsSjkZEp`bLvR8o|M5n&30ZuEu;SR?Dt5 zu#<^dXz4K~Q?JOJU~ytbbH@zHP+&4Rn0OFtB*DjW4v*FIc!6&YK9dBW2D=)|M8K!n zfWHx2E=twoCU>v+R9H()hPjeqrODufRU=Ue6Xh#^qLg0`f6!9?y#^c)5tpiSO&*kw zZGN0nhA;usADNVMC1uE@bO_;rs*wa;KXuz#2;tQK3MqfGU0nvKCt5#up;{?Q7FWE1 z#YU4g6N|yJ%AuQMuA4Yz5<7?(m|#-};53s)aPiTjhdiAClhG$noV)`*#U?xOIYg8s zERpS#r;`kn@32-5lt2B%C5VHlDGZ1@X&yIedh)N9r?Xthi6wIVJCI9xSv+~t*ifD- zt#eJD`EH)eOdiXFSmVYHHL-?ThJSm=Q?-Ge#Ee_1+W%v>j-ZMw+#WI~SYu2E&K8!c zXG{i%C?3QbN$`M4;6nzly~|U*0e@rS27sSsa`%c)g*C}!m?s%3Oa{w?RU=Wyn!MWs11HmrvdfUCWhUi3N%@3H=@7yLRU-+0U=j!+dY7kFE>tZ~oT&yD z(@j=T!H30QtJO`Pm}fbO%S~bj5d#x!>ZA#qG^SA;e0s>!n=X9aKmAnW^Wu6RRSqLh z0iQg*W1#ScAMuldTCFxv97IiFK-4K|mPymQJbmCohCERN0c^RK#baTOjh3g+OrH5} zo^G*HsPrulVvQU77ZYo!W%##;JY{D)`Ue_30c3t+vikVfL*@i)fXOgZGBleE4pBUa zHIiV0N#H{Uuf5AtfdPMG;wIp8jLF?AJ{4Ax$uLhcywm13wdKL8k*H@)6ftqi?;%fB z2Hf?D8&UopCQl|OpI}{JQqGfvm|E(IJ!3{0@8ljdoYMsV@bqlY|ga^Y)vdO+i|+++tnhmohgK6(0` zfwG43KPX@_;)ti>mPD-u7|OwQK2xMU_ECt%#;kj zG8r5sJcu=tV4X=|Nab(89`@C12K7V}(`1+@8BQ@7EDu(VMCF<& zUwif7-);l$`b0CzfAv0>88SHs`?#=Dq%E6yl5&Gd=@7yLRU-*(lfYm99{ii0x zx8|3a$(o79VCyJ1J^0s2e6mUGAYx#GEu1vn_qx?GjpFb}5B@#Rg|GSd#~Pn@ll}1g zo8#l(3k?*W)wCQaHy9`mqNXq)>ZFOAG`;ihEEh67AXsRxQ@!+FXP{Bh{5#iVm?arL zk;8Rlcn1j&VvQtt#UwDK^0!|PdfnxM*Yx_4rq@~naA77w>W6D(0TKiE-11#%?zc#f>oLFK%ol`PZUzQ+ zKiPDUvuHl<>uLEe?&}$Yy&gZ)r&!}E>w5%;ODDMNM}7D+nZt;y&hNUxJQ82|B`b}K z_V$=yZ2M6yAzs9V;NO{G0=eX0ywDTD54gcNvvUMWJ_UcHoWBM<6Zm6Qt?V3ELCjE3 z-zxR<4>7q^O#d!JtYIc$jg05fAk*Z?AGmT_2kRYa9fK_v0~QUnUs&;%{@8-haDC22 zsa*#~+uL!AS%29R|MK6mw{AI*y*f0!<&Tq-{q5Rc2c}NzutvJTWw7AF@BY3tI4;X| zyua+;?cr17WGtK20ugjgJHW zEu6B0K=e+ZX>JzaLwyE(9@gpq7w9w71+MXN;9vGt_+0H~0Y0~Be1`On&&B^W{}fx- z8>q`%sJrg;s6s`?DKqTYJx4?%2(J|2xnxk^r3ThpXdsMsA$;2hp@%;3`0r+uug1DV z*XJ^wuP1%~Z|ZZafx66v`q>@5*5?B3J(XFM9`#vcAdGe){MrZMu=TmizQ)=Fx8EQeS2^1s6wy*y%mQYBz~%P8_}zFo{Qm00j|b#Hzo&2e-=kl{SK^1w&5dfKpcZmTCz9sT?;{_6 zbO;OlhWsz$_gMO?=qLES*b9D+{3NU6R2WX=p54a<>g@UJAXln!?A!{rj zIaY&dg3;Dp$N?66g2(Z;plYj5^Ae|^Z)cHMQjS|Dg&^_ z1vp0oWSd@b_khTK_}h!W{%DG8k;-t-tx3L}QH9s=1%N9X>N6 zOxzzkR9RC3@ZN*IckCxLX^MUC)#e>&P9>UC9W*HgE#c0O42eWkI18Kw&8M$-$2^jTi2i<4<8dAbtlBkq^#83M)bOYX{h& zXeCx$7e2+aCB#w2hg5=*%1@J}Pz%~mD-LOWTD}WoHM(6-4p^N(;-nWxzS#UX=Z4PD z`Y!p0yLroqmb`3cKdxSd2PzqXX~+kg2RNxGb-=&DD)6sfZ-Z|=9J#mOOzjAs0p@R% z-Fozg)z#n8zpc&Pse=Q;-#!589FVxB!hxnnazY}c}Wu1?Q9jdhZua1m7vUyO;9&Bif^%+^$r};>3Xxq}aWe+#B zb#6v3+0)iZ@5%Pqvebb9^BsHbSNNaM{xXg`{bd|^ z#)slB15}Y3FFPITqU#jwb1TAjyFqrK(hg&H*vmiqvb!r}=c7UxT&(O%3lM_~xH)+S zes%+?F9(L#JPckpyY41+=zVyTI*z!1K%^RfFX8Vk{Q32!(?2#B;gq+t5ZwYYK$CyC z+R<(pY{T!lMCPl|a?{&24@xZ5!J{oF&r>>&DDzg#Jz&Q|`aEUbjXXHv1CMDu`CH%~ z@o63ySE09Ln;jgFvQu~Xl@~>Di6pL`Y?Nr!bBI2YENGl6Zia#5r7n(BafTawVq~!TUQ4FoxhZ-@3^^T6G5E22(TZSdm3mA!PZEY zVG0K{JFUqIo4ncRL=%1BKXWnYx-=M9pUT$7Li(2Mu;5zVDT7C`OV#Oa8Hn@B=c(>e zb%YyddN5-zVdE=|5mw+uyrmYS!x~}@F|cp49zrlcJh#eYlZ?r$zusgxB{@gV#+J9s zO-1Q`LPK~eO=RPC^wt`w%yo;9d;*R)<8WwwEIl;{pUfBK$FY00`=vPCB^@nwEM3_> zxp}1Zb%VzOTzG{24;l$=MBpl0hXA7`@-$zh8HIZ_sc~!4$E%5_^W662jH7PP<$S9y z0n?nI-D(I+-hi3bQuWlgU5fx!fp>4GA%htW`CWsb+mMSEIt_W&d%~T%A?e>obK6`2 zeuWDh4JrOSw7g2(g>IZ_NT&)e{u}}L`H=^BPOzwtbrB13+`LpByv2t6tU_&)92nF2ie~QSizfijKt-gIt&Ech&Ew}$VfcJ!NDg5M#@MSk>;k!e; zYC-rg_TjMrO}A^Lm}gsr9yoV`a>%(T&8t_9r1^xRVjpwCnn z4)x_B^5rn*)h3h6n8&huWXu`5`}va#%ZKvkY?BwOP9f3%^POtUmTMNA zYRoX{crFn7-z@{x@XD`|xTS8Ksm9^(*YdT*wb`mTX}6TCn`|GW8Nb7$&* zc1@0O8Dr`P$n7(x`iU_mEpaMq;_36Lyx@YyRA0xK+AcoH9b@We28n9~iO-fw1+_7C zr-`JWicd+}$D+3&MUY^;&R+L({PUbnD%=Lt)}haO; zKenS9IWb|-2oLEPXVEa~>>aNFY~>v|Wo zzA)=v!~ok87f8=mIiDSh(<&1oFBlf4Aw>ZQQg5x&&uNuaZ;KUyR>4ZADe)E*W;rE3 zexpx>mbpn1quuyBeDS7v4Dwj8bl_aA)A=T}U3t2h)n^+m(QS01wZSdMT18BLsOw(p zLdY0lnoSIcw$#t{fLvPYF#~d?59A+ja2g-&WeNq(PKm#Dqov85CHh7G^%CnPk|TG~ zh2h877C*|FoZBOKa2gF$OI6adL^_<$7tAN(u8__%ggAVB?0oEfWI*J9@V6g-*?{Ap z`ykUh{FEHbC4m`H_@3#b#&Q1Y;J_sxHL2&(GlOs4HsX2n(bh1YvZz&k*xfnYb3&pP z#i|SLN2@@PV`|+?{}u-u5fai!mzm#49!nn^^8wxUv2mr8BtABL$vK}b=kd~`ok?te zB;LJveVp817L$7M+8gWP;|uj9`C;J~|A+YKe~2&n5Amh{Azt4=aCrQy50@XlKHSsX zLJxcoGhjd;d{>+A&BF(ov)?3ziE!v5lLgiS9x_=@nc(aWRLnDrT!q+!e%8}W<)vpo zi1fD~HvNvw^gq+-XC5{^^`H+vwGiM}94@`~FK`U>3u+$Gp2T3gVFJGpe?^!QFUCkQ zOV#ei%rd-&V3M)?{mM7(1DI6fa)cBGVW*BkInOVYdczF`#&$d>T6qv|LFqw4FU`~2kt5?OmBnzIDxSVZ{E+DSHHP>6J@>GTc zFIgboAg|VmN8kcBxZc6(ezujDnB`k^kEN?pP`aUAz=XIt+Y0HrQ~-AN%IRv_|0=Yuk#8k|O7;kb8v8FOpLbIB2{+;pEM zSIy;H3+{vKs^XCjFYwZ$8f;2~=l3O*^anb|$rwT(`+S3%tuN}ql-0-vbv&;c!b%9Z z2qof5crc1nqV=gk(A4k@APD5Twl}D^^-VmOUY~{@9+k|vSxgHqr2>6y2qgp?^kILT z5X5mfpOZG*$v#R;+ z^f-81xjcPA2p631!3SI&Vdn;ea7(!s`wWa|pNL(8tFJ=oBjvsrdjLH?vf6c_m3xGv z+3n^h2Q{p8l@!hIcJ;NlOtz1#e6@LiT^Fc)4a=QdvzBW{fN$($>gufrLFVq);6q1t5i~0&z0AiaLxNL3jg$XSTiaZ?$v~Urs=v

pJ*EOG%jtB3|2d1)WiB}2R{Kkc;9p3fh6KCjIJT| zE>b#lyiM{tUd3E)fxp-Vf)6!Aoir#11_2QJ$g>h1b;e49EJk3&BCY z`7Dj6)Ii-i6GEEDx(VWS>J|immvz;sLwv>lX||__ykgw~Bq402%I!q)mpW}*5}+%$ zrz?nzQ*`Ba(DXYAho;s(*9a=jl$+B6+6Qh|gc;R)Bu5 zbOmN5X2jGh^PLKi!*QWovoF(KCevb*sfL+;Xfi=v_%h5k8J3z1GnnCOlc7%iRaTF^ zo0W8nZyrUS7=sOHuK$VJ=y0%1wVn3_s0|+-_~j(uc*@-b%3UlDWm3Y$Z)BCbkx*zB zPUx1wspBw&7cm_7C4MIB`)$J^4cLmZ72oi}v@O(t%jB>C9l_o`c+P?y>9bn1_Y|GxgHezd%uRN!`tsK53I!~KREq~`f<&3EG4 zUvup4{J*IA@Qj+18Cmmzv{XQ~Y2uq6u4b?+LOqOqs;srYelyq>vk>9cZ#ptA29Ts( zuv1$1p6GI<5(jUK*^YJ|+l*HzM%#8HMO_2yi6m_8TB+}ZsDb;+%ZX2S@5oaGj zY$21`$D&J>Mdbikq7=J!zN`+f+=3XkUn4RWs%)7}g%ZNoxaRXck-2-8D>Aon4pwA- zULp}wZF5CrbfNps zk0&qAj=_ZsP#>3rC_KmGkp;YqVbD$ob`#Z4XLG+Nt;0xz%4LmVKftWniqJsi%S)qP z!EZn_N-tpj(qKQQvx+0aF9YG0Hh=~(lHW*ud2M**PzFB{U5>ygF6!Zp2)e#=5()L8 z-nx}h-4`$o%jyEl2npTE;efRV`C4oGNY+~4AT)Lp+o;u7*^VZFL#mJkR$6{WBaucKepB2SnXGu_1c)|M#k zekQ4A$T-UL6v#7`F3FMuA~he4tvI;w=7Mk0Q^A@m#Oi_9oic1M%c8LaH`#c_{epB3 zumJP{_lss$53kka@$>&&6sTq)!sCC-UK3r8V4%Ci69Hld5!fVA;Ep0s3Wj@9Ky^tb z8SY5I0x(4q-$nHIsos20q=BFgCk@q^(ojojC{mv+C2wnKsP#+3nk!v?3UfNrk%p_# z|3l})E;a07K^h*$riawFxra!@SOer314K&$F-2>PM}5cPS;%J6(lEi1hKZ~&q#+7s zqR3BI-=E==hA)2lRnqXnw_NN`HwFJEX&_3JhGAZg#8v9=@aqJNBcr|6OG~9E!Um8jw4RSV7=r|g1=`X4$TprILTo9xb(r{h|z;9##90h6MkxP*V>7#JN z#o{YnX&6pcpGa0Os;5ukV%+2*0qdeIs3zGz7HeH2*Ay_-6eomfx(jHK^puLyX_ShE zQ(dVj;pJR(*j${(r5w1JlJXISeBcTR%Ew~AeB9cqE9R3ATv)Z5-seUQ4zFATl;9>l zyfTHC)tB~9ZO8w8mVXv#Zl?G61>wiXW7vfhDx};Pq3SZesY4bS3`&n&g3ThpTMAH)Ve}w!@Y0A0bw1QgM2s6*J^pTq4o8sOBr_f_o3{<%Udc^Set@-0@E0k6-F~JC`yh+)R|v%tR@|=y>xIRXiG3p4Kn5G7ELN}(MJ~q4FceGPlVbZ@yHG|~1!3TY zFow~lSp&GS)+y1lR@_;R$h9aytrt)GTqZwRd#V*F1#0TJebVLN`~_%-P9M88XFw_B z$J3W&seA54e_BAUY_#`bJN}aU@r^BQa6|~m_n@RYb>P(lv_Pv9S#Zfs1lX1_^%n%E zE*-@iI@BpoVY8xrAknW$oxYV6A7<~c*F?vGhjfRaQkZ#Ov5nm4S3kQqFAf0ta}nw4 z+m>h&L3T@Y2_C|htMCHG$`>wV=SvoKxG~x*H-aF{fWOefTCedQ{-(<%^pNSAzE(^< zK3y9(oD~MzL;xD}MNCew*hU1gqm8U@gj>coCwJ9>yQ1K(BKrk(@d2`rW-RfrBaC%b!cy(B#WB*T znp}Wg7I=r3i{!`BjalmaAAp%;YzOAT^`ArT6XUHI{wu*nWUiR{!7E@cjLTsK0+R=c z3AjwPAlPNDoxd~8_59NwbG4vhrt+T0-Rjhprlowg24CCOfVI&p{k@pAKvx%Tc^>83 zd2104ltS=g>4f79M3x1+1ls!CQ6`kDgjP~Qt4EtqXr?SH>vvG_>RnmWV<)=ET1%C$ z4!C6{XIj%GO+UAkWP?@q1k>c3kkQtHoebG(;GAt`J;#t2O~@c?vGgK?O|F6JLu^`< zp2X*^9rNkx^g*2Y#f0NgvR`;*dmMVWVlYw1o?!L!uVErsog&}Cshv-t>+zGUZE>SB zzj$*K_=sPrss%&z{Ni1tCFa=piGOMuw7X=m-e!!t4BzPb{Q~a6JI95G*6w9~v0U;V zI=|Q=_;B*>g9c$+a2V$o87@ftX;a4hBEx<2i~796t2fK}7TPw;5#I#khBXtba06*4XKC!bP_Y;{$Nt$d zZlI80mh1!Gc0mMjZG-~bX8#*rg8XpH@0lPk9|`ONrhsYl3R1A&3s(L!-10Eu+X@+- z$7t9!zhX4jJ%W{QhFdWB1pFc&{5u$pg$-Onnrw#A~| z()(pY@A>ROhfW4Ju|7~z+SnQLCzc;TX$($Ru;_G!6i~qe(iJQ>T|p$$6;iy$ORw(n zJc+a+Dggd@q)zz9VP}tnn$H&GEa7f-!eyL$X0r-Y*Qs0tNKL@m>&g0#iwP|?oR1}P zne(yCE|c_C6Wq#PMrAC_HJdY~wdf8|PfYDo9ArM$WD1&07nn>k9~(BAP@^*iYboWm z2Dg-PCWFk!zKOm-mr|!5mD7zq=VPsBF`CqP4TiV%ym6!vuCeIqr`Nwm40~n?&Djv< z`>JT=EqT9d;EupEixG&gEbCQY{#^C^SSP=$1F$A#z3odf!2YcKb@dY`+5WX7Mtvgi z^DsnPaZn0)uj^}eKtfw}By1wKt-G!_ARYLG#i#pQANU~Ws+fkVm$e+FMs2~fhFBiU z-j%&8o$FsrK^l(af;cvJX<+HO4II%G+Wo?hPg&Kce9!9Ss_fRlDjqS~5m+6=05faL zUxNc*=Ff}irY|Zl4J_HCmkvD*D)0y=(i-@32nd8jKtp)&IHz({!Emvsl;_x-gudMsZ&H(@pxL zO!}EjKh&Qd{^(H_*c?}xnPgUCrowC}IaEW{`mavy|AQzB2t$z-HOa3-@+JP{Qzxf| zR_Q9y6{5=0RiaO-M4wdMg+kL+qED*s$GZr=cRF|XZtY*c$(rWlyaDB}<07LywZi({ z1;en&HzJ3m3b%BD1J?6Z*QcSofF;NpbLHpB3QZLbl=5S4lgS=UX|g#S0-k_=1x=P7 zL@1qd-``rq{@_HeYN-)wf^~4YnjI1)9gY6UgB*6z?cM9^={O6QBd>0F3F#*h*(rF8=S(XBpgsWnwQWD78hts4x0YcMPr zK$rL!22e_+YI--CygK(SkGUS>jzARmtLRP%P=*w?3fkm3fCoNf^5y@rr32P8njraI@EcHCDw;!K~u7JfO_Wbb3x z6<5n+{>RCVOU2;R0(+jC?4`J~Ga0kv(Up6W7ulEc=S>PIfGxjViaEVKwve4tr@Kz@C8{TLCW$iWY;C`2bjm zeMWHJjY_}_Y#xThq7pCH3SF?D^bMDcGTSeepG)kgL(`-3$m89L=G_0cNbGS8IU`Lm z$djz>st6bul^hS3AH#qpF9sb26o$teRkNUgL1=OmLaPxv3IdZKXETpiO)i4T!9cq< z&arG!tg%r|eTzJcWm`_xWHs|7b%goq)C}R~fO|aJ9CAk0IVX#Iz%lV7_5iMN#e}N* zNbX9+#vRwP(Ru>uc@`VDXHSWSm>yn2@LjArdQab$1ziCx0z;tgC^MX-H)A_5fG7+} zulK^gfp9Acn=`J~pJ`H8Fm!{2{^C^=DklWrkkDUyp#zw9`tLcMyuyR~5vXBJe~F=I zyk;Q$nW5FMFtpK2D;xaUCG9jX^bw{Vhp|#zrM*z9c-%j64Y&+@gbEe|8@Pu^=Plt2 z_SY0F=Sy{DeG8r{@(j|!M_ArQi4LXuJ{ZqaWj%7d-d< zX#jSDwBv2<>)4g`TMWqr%G(HmCyR8!-}zDy|P(Kc0z^_!*Ml@trveqiW z6GK(`L@m_W=och|HIXrD2)@IQ=P}ckzZ6>cBM@_Jd3>sD#6f3gavR1oro6w7b;<*~ z^)jCR8F@6On&a6QSCF}5O=H)jDWbI>2aVN^~ed6bIpNKeS>PU`V zzX?H5N}*Uox?%&~(^VVs>s(BQdz4og++p;oV?}F6x<*XXUFYN#+en5E58ZbzbZfoP zV__M+puzDs6J?ISjgUN9>(YsNG=h#Jp^*|1j^jG3$QR(#d>7XybK~NtGUK2V1JEUjTcP; zS8>kd%ZnggdJ6$sJ+9{ML>CG^qvlF&o6vy{Z!Rw@RslrB)pz)d!|AukbFW$|Po);( zY3~GtmAkN#8EG!{ioVel{kka{K4W9*W)$6dDhwx-k;HD_%CW&^0eeT+5xBwV@h4q-a#vW~Sija;6x~6kED-G3gaU3a5kx zh)s-Vw~vJjHD^A3F?{eFATco2-e3FSu=i~_m>q|qsKz52+pIAQtw!^;B}!*NG1cB9 z!#bIwhBwADc4of-f!_BN0Alq+65qzeVGsJc=mvy)i947$JGHGEbAH3PF$R0ELE93% zmfDS2)2&zAu14XUWbY4LV(M4?yhj%58`Lm>H^2eaegQ~al2zBB5(JFBX&80cVO->j zrHFB`a48*Fb^&9aV;ulBG_NPH{<8}fEO>oxpb8tMXH20#a)wE>uCRsa*W25yi}o+KxXa8d{stlVj?FM9{W z+$tiNKUFJI0ez1FEz2?j+Tti^y$9Nl;%1tv>Xx~#{TgbDmA|jzn^CExSgf_^j)$Y@ zVK4~G;!Sn+4XRLzVlqP{Q= zHfy9#ZTvMu;iHC^y&;;a1OR)#??nAb1MZ=3kY0S*0mBFfN)cMC=*jBTwY{cqt45a= zgTK`N#!Nhol9*S^zA>(Ld*Mft>o%bikE{JBnbceawceA^ES%ABk0m;^{s5z^UUQ<0+4Ix*jN(Q8 z)bT&aus0d*w>Q1~AB>RvPIWy9us4aMCAC+R zzfOBo0$Axfbuj{*s;cwwZtP8x=}>zUi;CF)V^O|2RBs1lF*pga@)_7XiBS&SE!kq7 zwMz`nL16wi;)*mmn-A;^MH(B?iRJCk2In*D2?z$K0duke(~7Jzv1jLP21?ir^FLd` zRbp^{5^i|_2-yWsAf}BlV07+e^j=6(<)6bXSowrBwj&yQrxA~S>OsbfQTk=_slStTaK;=a&x@}v&0YU6MwMmW>@z5$S+PQ48M1oW2F11P}XT@~h#!1rmP^E9j{ z2|8yAI%g7{^qDM%>p6M?MQCj7(>K4a?Nio{`}x@b=s1MPv`?QJ>0%-b z5@8YQJX5Olq=K-;^`d;YRBye=WZFBzttI!;=mrye^{w-rT6Um0&lIvqDL*wC{$w(U zz4}X&p-x@UyS)la75(2#aC`A-7&~l(c{3Lbk)$KfB~A7dVmcr&ioPtuedmR;wHX&G z!;pv~Gp?FtBLkzeJ&XzrMh6W>b2))lq%rEe9UVW`lGG^JCrxTQe^E%Wdct`tQ;+fu z2b>&lwmHSIC#l1{%VF0T@uwS>sevPZOUhFc)qALfDcoR>S9jt3q%QvAW z1d7Q#RCc`G7hk1#i{Z>*y}Ck2mp~?AAJEPmZ}+dO$8%zL0h!T0u%i3jz1`i8tI+P` zSc~?$W{^49j5-7pyiKhw(d8)7YWZTINHtb3TGxoRSZ5Vdx%E}EK|3HZ9Fx_Z-Nf!_ z;93Mt^yXs+c;=$o9@vPM9;cT6GSg~}N#rp!c3-;^`TC)UN%R4>!|L$hc?%?{1+bDt zUuYD{j@*kn%=&r;q6=ZdHUTSxDE7X*NJQ5OqV=8in79X+QZ!MSeGI02Rn4Oy9*k>P zu^=k9)?{^!u}(B#aSxIjLdzK2yQ$Sq_gH1sxh|`S?;v57*<{9Bp|inQD5%iUe^Vzn zsn33klJp4&94ib=yBr%*ZvPf7-US`I;|=PnUt|&mY0CFMI3(Rad4vrcpIcZT9MZfW zo=f}d%a2%KOw|viZo`ykdTgM%@6?X$?O>>Rs1;49{mC$|9Or0esTAd2&b@gtDysf* zgq_*A^3|Y;$*U5MY@*9d_mldO<2p@)vmy_54 zkd%W8mt z2_M+O5^mugS}WfVxA3+sq^QQ0q+0bev6`B5 zlIR3=of~y0qn@R_={-(U)I>Mx9!7D)A)spg`S-^m8% z{CK#9n+zeOg_IWP0<=-~7Qe{f>m}tKf@qis#Gtw!>?9Jqcg5#gVmahm`FgU(`ZWr6 zB{repIHbD)g23hziS-0wErRM@iT%|u61b#u2n)eL5lEx=KYOEyYZBwnCbZ}h^}<7$ zteM?Ti5+G4<9PIx>BxJ8mRRmygv8cH7gMEI170!R{&^BxZSBlJbQ>(-CPzF4Q4CQ< zVq2m_H0B~2(uj6l50E8PZ+1VPHe5+XB9hBp!dYG4v>r9!apRJj3GkHK3#^}-@Yx8z z#0mFF^KZ{_nQ*yDI*UxW1zHVEI1PaAzH7V3B%u+#)h&;j#Iz!V)Y#RSaI z0pHL8kkA2fb?|4bMquUp$pMY(1O0)`-$hwCM3T(4Ls2##mEL$vq0~kL&>WMeQgbYJ zhizQ-!4iED*7?a_oX#Jyv^do@=_XZd582>A3d1av_PY3 zIbxPAvBwnSJmBG?FSjp^Vn5O0qR+GACH3l#!$l9lQdCSWI!yG^sJds;XIwLM@3Yp! zPdM(wf|Row)d3J#*TM>ytYv{T`So_Z*ja`t(xX)S0FKLg8vE5Uw~gO7ZG07%p#BV1 zPK`}ZlQN8wWwa0`#9scX^bf_<9sY?H(uu@fHoQSSj5NK*6*Z~b4imTZYijdEspDXv z9tBGmbBJApDi$`?HN;uVLM(}K!h(xzg|Vi%{hWFLf(?degnziVdoxBNnE#&Q*XJ{k zb*`MATLQL#z!pO{M$~uF8QY5LvJtC@=ww6Su0u_&ht76sHHwRk(!0q))kmPMsg#2V z#_IGQfNNA!U}QAHs+zzjiYiqXJ8#2Owewb{&cz!?99Ts3+g#_HqAoH;&FXAL6WQ@l z4^t^cp3zG55+)dfF*q%*BEQ8o)k{>uM3?6GVwR2Y5@kzKw8{Xf&<`o!OY|mM+a41_ zaqbjmE~YR)V*6@*ICcQSFe8Se8aP4%^WyK&oOV0{iqzWK>`Cx8PGX*w816luATecl zn^O?NvEzPtmhKgfVTCRYp`&LsxG7r44j#o0SHF88ljqqXl-bA9gv5jrnq81JL;om zAWO{8!+8$%KD8dYgQ*O zKGebsT9o-EYAYE>3k+Q$8UfA_yL-Jv_xlAn;)k@@OLU_MaG@69j3HWsmne=zshff& zOSp6}Fj3N|&h;Wk5CU0P1b7_K=isVdolN}?To%2Y zX4rl4YuQKIH~@k9nV%pp=khV`MHsXq#AmS`wBv<?OO39Eex z56zdtZwejcm!?H2mZnE@6AixT%pG4`O2!u_mGM=mzj*W;U+k|C7lp4Gb=&FIiK-Nmqh&_adFPFnJkgDpbTD)U+N8<;6V-a%sq6+Lah2}BM)_S=i`H7 z;=tI!kYBC)r`Q8HkBF+PW02m}CoRz^g5b;LiRduAfLg)w{o)YG^!7ELW%R_?T)f5i zpVQmVjj0Y%wXlA-PX%@a3B2BH;5iBw3BN1%L`UIe#phZ0U2>7*{~pM}Vb%ZGw|fi zu#66rjv(Bj$`t~wwCh-4p5IW{qz=}z6=@f+Q|7oYFs#PlrYf@=SHkc>hbzldU-w+Z1`UzzKL2M}(B5FA%`3?O$%YMT94t%TnHs0rQ6 z(4>Su< z_oCnoeqlq)$$C9yCkp2N9e(1Unh!-Q8LVOi#nd!>V?BkLWd9BVW&aMIsz#LZq5F4C zc_+E$ft`BUzjLzWKXg5%C@yoS7_I)L*d48MJ%!)>9bnTTj^>0$-}_m-+Qc zkgVDgjo`sm0bJYxj1m*9vM46E@d^gd*V26eHKi{f%-+J65A3il&>hSU7XJ}ouGmKK zev_!p!*{60*CDTmG1hNL6icYBelUpZHxfW1*QwPAu)9-atlvm^ zxX7lva)<2s9Ur4!jSD++l}=$v?^DzXi62CHb*a9s3{AXTYY!;g>h0EaDPE>wq!S4lV}} zk*;D9>8dQ?m97fNZ%BS4@|!Qeh4LH3FIBc7F;q+tmp@fKhql)eNh9{#fX9`F2O!Pz_YgcB6HQ5lCPL2 z60GgMm;vf&W~+@x*DL1YWLDQsYj;MHefda&F?~AkJ*IhqX&$g%$w;#sX@D3ed9VX; zKq`+i6zS@pI)yL)vR?Nk&Q(9ui3OX#`CQW9{RC+(=DMZsZ31 z-HX31_zQw_W+D6xJe%;B)hF0DJNWa&wwP~6CG=Miz* z(cA?c#q3fYCh@B=%B<}!pjttxn1HMDaQwaje3Ah?i-7M3U`Wz1%>1eus7PuXZusd8 zp%7e`);!2M%_PUJd36#NQ^5I1@h%M*5GAJ0n})tTuLZ2%BnN;8f9tbubxV;>Y>uyu+ItXPMq8(V)-Zlhp#ZqJK_!*1V&NNmUsJNWcMX- zV)1ps>^<3gfCHlPWoQUAeK=xTsoMR4mw5ar<5a$b49I+rbzufBUw#T) zSOt*uNYEYqSX`|FmCz@EavO;tmte-^10VQVWa;Aqsb{-a?piw72EVQP!tRsm41l@9 zi0dOMQaGZ%OaW{W>(SX4_bvnIe)YqBE(vOU>EpYi=e! zMXn}uq)rsBlVkoIhd9Ul?-`qE=z`pw-4_3pP26x4;`IJ4Q0ipy$Vx0u!lf1%s$X)L zS86{~s(8H@!NBxB?#Dx^O=@gPD93IqZe3^a%0*W+J`CYm6jH-xz$e<+5Sl4HE@C%@ zKrHJ9HzkI*iQGi)jxo|T?HH2}46wfqS>x*S%h?!F=~W(pf{ZNP?M?Z*v z0*;r!3UKiFNBiI4O^yg6q6uofDwQAa67oJ54Y(G>6!pkrAtaU!#rFV#!2+!a(54+rXJk0sDOWk^o%D+VisP6EO6O;zFhD?(A;77UOIn))ugCmET0}#Y=G$ zN0VjsJo;Ei@oJ2TS;Ip?G&j&PwP2VOE}_^32Q*8Mw~uKZzxoUCn>~VD*4-TJ6Az47 z8d&x(xVBBE4jhyUH5Z9;n|_>IB{^j!t+b%)c!{eualbXyl_M?RKz{@_D25t}K?p)1 z3oNQ0wU1xu)m{%yv3Jn*x;4U!MElf&L~4JnzkR5osj*{t%B1F zVQ8yDv{g}0t^Msnw_a*L?d@&p! zqiU5g+P!+T#eeq#ne;641q!P-aaaWe=9Uf$$G?sd z0(T9SF;ABsbBK7oQ{Xn=Km!2Rr(yp;G$)#;yxm?S{O_pcoC_#Wloc~_&=wFiGOEd{ z1ZkrOV`_jbv0?1Y6o}{Gl=E95#)o36Q#{Q$@p?SDaI|0keB((laxfi=YNG_(4OZ@g zyah$xF7Tw|SW}zHrZ$NLCaDJN+UPkdXPh|_WjW(a8LZmtqEwUE!rEQH;Sqb4_M5Kl z!S9>$U4mJr2$$dQGI8@v+=|B_wo`KDVYJ&|Z&e1QXd!)J4cfBZ0 zYyNIV3iv-olslgnh{_r-W;OF=-Mzbj1HQQGdn88^oRtl52B`*Fumw(i1IH^FR=x*g z@O4`;m%G*9q(C=d2d$sF6{$m?I6Nq05;^(q#Q(yJ&sBvw-feH>hX4jTKj^!^+rjsa z^C7Pw1a^$bF$9o!f442T$4?b9GF z`(QaS=vf2-#YjU_%o>g%JnmO)Li8oHr%F?ueK1{FZ|_a?g{Mc=KvHN`S|t}^vM>n$sgqA=hZ9vCw?}0_rXV6@g&2D-^cpxaBJ9(> zzI29xHgijo>UW;UKP^#OPswCdLVf1$L85 zPx{)gdhN#JpGQlZ^|fELFJk)!I0dwFPxFOdOU*vgZK=W>SD9glDE$AT=U_`+j;5j` zC1M8N{dN_FgqU|U)vEzhNq&+P#^0}j3ARTRHd?FDXiyi}NrcV;_lLr*3q)CZzb5sE z3A(AV^Jz&9IT5T>8MBhiQ|sh`ydn=koDA#QT7W2PcnUwYOvFt#P3mg2Jd7QCA3)&B zZ}rPKzX^0;6Z{WIL)-hB)WXZ;HFfY{659xu3|zh>dUQ<^=lr{JLB_5edWvyr4Gjx7 z>ZoNKe04gtG|jc!sxcHQfGGYV07gLBqNI|?$*s*tlL_jqRo}|Rl;RVQvDzW)Vqdmg zwGi2m1roZMCada)qHq@i{n>D0iU;CkI*NNLx#{j&5X_;;a%p&#Gg$eNFvVq z=D|BF0K@Gb;W!qH?A=NkFee~u=VbiYd8=se#MIb3WEu=RZfoh!=4*^AScAAWLV;tAH;>VYub*AZXh3Kjk=6&dKaRY^VcHPMM!0}gJWQkTz&)v zys&(K*R)g>tzTHV*1jWiG4GwovhHD`EETLLZSvPM9?~JbAtk8ic;EE0wmE5Y6BPB((bbTAP3; zWK|{t5IEoRiAgJ~GH>_IMd&6k?N-pU%lk6$DHvx*JFMx-&l_sbySb_m|{qP zn7Dlhf@Kzk{v^0qYxrqhPOo z7l2JEC<@Yb>LCO;sH*$$F60EJ>sif1);CgBr9=$7`3X}9^+y=&LMUrF5Vj`#9zr;S zcGKHX;gBTQeGZm5nKF*CePL=qP8Y1BTmi^>!o-aL2IMUUq^!FNNQ)p_4M@}h_@Ofx zxz^Ey>q~k-sWwnGjM5eyVS)Qm|F~78izDCyH6p7V4rXj zxj!I2oI}@U;51+woLaAr%D~fQX@|aks-AW@Y|1n?Jd<84BW_t1b|*~@N*OKK3;bO< zhpFw0(5S#%!>4s3v$BMb4N;iVaH^aEzilI=Jcje1&zoLMpa0xM>Bsp`FI>)lMiGqj zpUR|`^Pf{BH0yh&e|(4hv_?X6z0lt?wEYD3TI;+}IsaK!#L)Y^($+I=WDr9i^g`wQ zXS;+x>W1R{X9=_(&VQN^oc}!2>Gw*2g!Fr*d||&=#uxN^!|+sdmplF5bcsg4H$$RB z>n%oC-RnfJb)(lY_}tHWbc-%K@cielUi!z|pLP4kf#{rZ{!_kr{u6CxGUKJK42&*n z|F79-W`3orR-MW&q1M`rve9+PC&ln-C}7E8l_3Srf8rbcBQvpoT#P{Wk9?}z5Z7D( zXv(|REsqKdA{gSJ)w>_)I>~>?eg!g@UY9;&M>3I8Gm>X{RT$!ev}nIubN8TcT0}*6 zss_dhe(N3+#ii!CpMKJ9-RBF+g&(r7IbHQ-h{Ph0tf!`ZX$GhY#I(&dIsz-ysVkfn zYKDSX&I&c>GBqLvtz$}gOYmv|nx8t*hilYKjSZ!SDpUG8tzdo6x+ zW<&$zy7e#i6GOdjEzRmQ9&7}H)Ges){NmrR5hQ>Ohx?BZ;53)I0q@2}U{hz<2r?!d z22h&l*ylhnGNOB=kBce?Y#OHpU0?4m7=;vV%maU1x42zpsh4rF$;fj!I-{8C>>sF5 zG-r(SItE<$iGheg223r%%SE4Jjyq|9e}x8_Rno=5zNkdmYuf_ujsS}H*uF`@hpT!)o?;& z>tON$>P5G{=$RY3|E=|mb+tjcnX{uS(9eK2T|=M;CeRH4$`L(#`!b`LQ{tFUmQ<`NotOxIM|9$ zRs+LVPuCdYQw)M2YnGU2??k=w)hbw0tTP1}iGSuK7LKI8LtFqe81U5$n8A$hbob_Q zY`-zc;?=hnnZ}D_$%*g`X6J1{otjX+d>ja8MQfvxwoQ1k|6~_z#4~XQn+(J#!ntsr zp!oiFyud^`6Gs9OQ??4To9arzER?FEkYU;7RxIbFswhqPpi{{3Q`p;#naFU?7*!2jkXgJRq8IPidaL(i3%L+Kw$NFIW&L1a2tkHMQ&} z7@O~G3}~2&m3DhyA{kc`zs1H5X=k%VndA)fLyV z!SmH5Jng1@`_F9M`t;a{x--ePjG!%Bb;^04b$4D0eFPRtPXwL4Z55|zQoH+` z&F+e^8T0^FLOqApy|qsUwbjv=Yx?zztHLV|rC;(?O+QcEj{3JNZr^vSk!Yr@9hZd} z1FSS^dBaR|dAq7`vhUs;qdwVxieI0Mw+nVd8?AEu5&d2Q^l!3S`ucAhp4=zneUXD-@D zaj{rzxMpq;`4;*OK^Y@Apg$fOVj0j(ZHv*@X+GOC!kwmt(y~;rNDV71d5H)7-~ku7 z?0F(^t%3l*FW_T{S;~dd?LY$Er+9vL$~xL93!gmIgKa1HEsWd0SJz|x5}`B5(o;Ec zuc8_)>0if_o-o+abJ)?oAsS82YB6hiDt0qLxQCnCLjhsX1nr*6nmXEI2#8fW&FdtpVp#oo% z3XCURBZjU;@j8+;(u1Tw|I{Vvxh`BwR2x7)42_RwDdC2%>rlRrq%5ZWWYTFoN2fA+ zjMZT|5CkoO41%E34MFd85`v&@wCrF>uer`=J1@eQNE3k3r+M_wa-D1N_n(=R|s>m@Zf1PEVBLq`N-sQ`mL@3D`(>-WPa7 zeM{rC9ZK0Ks!UK1ji{h48eU1tc$m-M@6yilVSaT?Erd-@?p+d{%d-*4cn>u*F4)4N zB901hn_4MG*aQj#>1r{MhN<)Av~n>_qwq?uP>`_bPuvbQc9Nqbs9bT*eBVfD+I=7j z)=k%WSpD%67pr*&tE&>g>g~@RPVsfpU!166f;Lld13YkJgEvC4_P}lZ$5fpfH^s^T zH%oS7Q3`QhVjoOhAj8X}&-RcRZ;(kDWJVL228~Q-3t^E@u@L(tkOADqfRa*uljqX_ zIh{X8Sht(pbGj~O*<4_V#p3XR(0Lg<-lDD(860b5&@tmb>+U+j`@Z91CdsESiJOkG zzHeY95?8C!vBx5XSx>IFQw7D~@G|%>3qN*25WnQV3FN;iv|ML2CCXrlgXO?xg>4}u0F#t7(NNZ;4@I#C z>Z($(9%~J;nD2;1$%oJ<*jlOC4;u`2uu+^QsdOMYO`^vS`v?2mqq;4^mdMMO_9%4P zLoSq^$lbc3wjzWj&Xlv$MQE3N=<8wxp*;#$7o3DQ;CFIUjC#5Rdir#AoRo?N;;_`| z{-lAXeCRfiY!!35KTJShDf&~WNqOd|VmYwnxW~?;X^hFUX$eoD^*~)<1`W);hO$?6 zJ){=QL2|IPU*6vMz%BnRlXf&G!2bp<3kDI#QjO{lSHTwRuU^2zKK99+ENlyaB^FS5 zb7+YL8e=M(Z($0?u5io!NHF56V0h)7ctJduIoB}ELRgAn+Ay0Euh*?e%Z#K+%#<-w zshWZF$aep<6|no$2HsYr_plaa?qSWd`_riHFE;19*yxzP3bq+9Z0OZO4TuFC&=%_D z+&*wGOgfA&NJk9S#2nWKQvM)KYt0|87G?5BlsrNCjLCqjgzRt*8G%ErQgQ-R%dECC za>DrNU_GY7NEzL`Izk|0P{sL(EI%*A_PK456YxwSZ1HSDzk#-J2TSCIBrp@}AsR4<=g8=# zOm)e@!6*#k=BPb6u=4fvH16v>wzc-|FH*a@?MO-mu$v>;=d!?vChY43-NuVUK_K3sr#CrQ>?rBv+HC#j$q14(~gZ=xucwF6(GV}4= z=a>bZ5~)`$vt-pE!&f4!rTr;vKiMyi{M&KkD_Fqsh%5kEL|LJnU4xpnA;u)RiKsxP$YRG+46B_)J#njBm zu%6km@4{psXtKY6?42KBEC6SV)E8Lar2BRn0F|GHTedK!U>ss(?hd;yHX@plJAhyr zgjlkUM*>`=h*EIe_B*~5*mc24khT~TL&4 zGEVoUz~&HMLe@6JU&a7mg8XpHXQ-xKVEM{W*Ln58){nhRkT=&~#&%zdXt?EZq-a~< zFXP8Zpf`v7E8KFYlrYg(!Yz#6OIp1ZZdokwr~Bd0V*CM-$Z$)X(35`XV|DS=iX)gA z<0ddL_Iiv074e0$N1T4b8*W14q#9z2(|YJCJ3%;-LRfxUTU`Z<0ew9MIh{v)8Bubw zVR+1$JxlzvyA*#ui9^uJU z_e<6zg-X^V?oZYu4o}u26_Bh)9Gy%peo;XhL_EMhC|$cL3u23f9l%s9WJT~h|C5aQ+nQC{3KG2?O33<=d=vnc@j$)MX)q5 z+jBbCl3JpkA^M4G@_j(@_Ws2-5-f+pKByYDM_!)xrOA^!UqO+>8m<#;$XtS5_css6 z3D%P0jr)rw@4@&sO(wkChp^!hzJ|&KGjB*|xTo)K6@oDv##nLc#i_k*#HnXSb|Y&k zhRm$}h&jgI6h$z_Oc;+`pnx29+&{c!gS-`lcMiU6N41Ed$3})-Y|rt(G<<(-7e;*E z`@9i&wHH;6_j%iHk^5ubR2uik`a636^Zr-}>X*8TD&n9)kyN~%nIdLt+#ic2byq4t zCE)_j35>NFgvFObD4bnLB&6NCLaZ3e;G~nJ6RYt1x z9G&;%-qLWPtvJ(x7%VDB7UxvGprl#EP5*IkiJCvzBu`sLQ}a3X@u_fR2=gD&$eaH@ z4f@@8J89~QH5fCzTFGmeR9V3zaBKeytZ+Nv0n9J>R0MAxBx*1Z4y)lGRztRyZ{0vm zG|k8o=E2fHBE_5NFvTn+G${^f8AJV$qV&3O*sdkAiMmh6%FBs3_wkcyi8g75_ z%|p$Y+S8w6r#6Ay_L(;yk(R=nkJkB7^HH)MK_%;v!YAvIg5zsrR7i4x4<}L~DKfq} zMuk-Q^r-UbQRUP7TfSsHQW9hwH&{rn2S-S%58);+?`CU56V>IZW>5CNC0!ny*iwa{ z_P_lwREVFbTwY(KHco$tmpCw~4(@;JOXVM<=0BqG!=k;zqN~U=-rN3);w#jo9GX;# zHK`KwYEF|Xu_jewO{&D2REagI5^GW=)}%_TNtIZW)F{68fRGw~{@&&#&sPy6|M`3s zDIhh-zr}z>4f4KZKQLYaeaP+iW{k#E0m;$@@A;}>p|it6&l@(#k^Z#R&Q&w7^=0$DWrCvy?Qij9U9V;@FK&PFJv{0v1lROjVN zkw#BO75w;&QT8RHGp{t*`jb<^dl^>|nPFSo+ri#)DkJhMNKVG$M;4w%vg2qvQl+%S zdk~iPoM}jT@8UB?WOap8*HobX;8X7lzh`rO~noSXEj+TozX%$)OF=8 zT!?eA>or*qF=y;BVbX`bjzRVuwWXQ?sU`KlN}n|jDcw4()SD=+`8cSQ+DH3;sV3h1 zO*Qsy!%E0TeSW<8yGVmKh*cvr*0F_472;K#xY9xWGMFx483_D(-eT5N@v4jeg z7UpCRf*^Z`iVq^O85U<54{14!GyzhJhg`}-TBCBvuo3@27rkz;OBoB{B`}PmF9I~C(YwA`4t8LN04G&ip zcmXKJ$Csb1TMo{~KAa2S<#b~MO{iZAZ<`Tso595l%EdBdU*L%G*Z@(`hLdhf4HCTF zRrm1{7(isKI8%8E-W_W)dy@CS!m$%D{AQWLk99TPYqhx2du#)**~{Rif2vuMT>)-U zDC`nIE*&gW2`(EF{ zk!X12>mR%V8WKJBd>?8wHf@+m#7pLxASk}~OlftS}kv#gK{ z-gt%qnd~6AhhXfbsmdQoVPYr@uOTgvrcePCir0|HP7;uFqENhsw17pS77&yzZn2Q| zhOJ1+9OzHO7)GvC|1*qPK<4LUG%4-R~s>!g*C_oz`i2P>*{iYYy9 zV#9+a<32huZ6zt+3QJCx<$t(-xD}8w3i}T;9q_$4unhSeRY1-1=*3vIjxqk5xh2Dy zqdsIi=yTkVutw%MBIL;+tZt#OY^)p%wRQ}RDfUciMwO&`u$?tW1Lm+kOilU70DNM@ zktMj%JTFOOrVu4*bLqi}0^NmNYw|7w{%HocUJv;z@gIL7OZOXkhx!;NjC`~ZIkK@M z{ZD=+_H8R3?0?8G8w>5^`WD5dD8v4_g)0FX-p`|c55re7v%cUPozk=FbpDVx(g7@h zWP}UHn&h=d=Z{#z88Uh1<5`&01tMgh0JIXTobKDdw{7Oi?G)w6U)VGqo_3b zq2&)@?O;ZDivx!RarlCa-zhGVI&UMCIbVpz*Oc<_=0nQKCb{6l=eO_yY8%ctp7MVO zW9qa0O2ZohIbp=S zJ@elY(~Uw6j-V-{$qfu;D}2KWO;F1cO;n2fUf?~}W%4&Cy){EQsUFUWKgkIlIe`$l zu;b(e|IH8{1L0+8kcfOq4qnqyvwpIRBnDHGTMGMtfr~xor46oi5 zp%wYwps>Avu@?x|P@k;9CE%0GgYz==4%ih6yYsKLSi-AjOn46uVet+adp^OO9>zHP z_P@mQl$;mCn8h6C0IG_-17?W~P|w2Kk`wYQydycmv+&M{IhH|iGIvuCS$>9AjDox)1s{haRJ96s0Wlbh}G*s$82y3D{MMBgG7aAyBOnaGn( z*jOCjS{~e69N&`u+pscT3^go|;pxzqJlJ{`(+1|Fl!v4t6>}AQ@n$Yp!HWvrsL+`T z9jVZk3N5K{DHWPgp$QclQlTytYEj{ADpaFFWhzvpLU}4=Q=tqMN>iaE6|$&MmJ3?NL z(5=YxudGpJ2!$gAk!EziD`L@Xy5C`70=3&qUXq`8_Kv@L1xQ0>A#v<)!!W7X-|Vmv zVizl`KNqJI&8muhCs)nEO7X0!;tD)@g^oK47n#s6iF4Mhs_t);W?{tDZAK|&Xb;q* z9iR$7Z+%|({PXkIqsk+?x__i}!n!m#FeG%h@IMa~)xnxoBr|j*E@6b%(#`QaQ;EyJ zd9op_gXYK`LSf1rDaJRFwKhx29Cf`9D)WDsDQaV$Li8J7{5}s4q7XBaoN2*JbsxH=WbrBbeQ7#lTAM)X>y8q$Dlt(Gm*o_Hx zTu1}sDlEmfmmiB>r-8%IboTvpNw(2+S%lbSaLXip@T8)$Oak zLWsq&!C5Io-f}t47vkKBESsU6One~>pZgNkR=I*XD0(hegv5B>4v%mX6N30)QL;!g z)QTlmz_M3{G{Tg1jFgGK=rDHq?I5*DW8bgEm_o3YIM$bgDGtxLf{LFI_S|Y*MSp7J zpY_Ewg9F~g0)IZ&a6x}Lju`rGo33vHMgre;2ucMA9a?CdugGCyfs<4CNGPV}pm4$! zf`C&&a-Xb6>H6Xn!L)-DbYU!BuOH&Ha9LjxbF_IX!o|3_pm87pw!s8}D?kd^N+uwk zhhm94Non**QFtX8^-uQg@ZcNw6|&z(0DVPO!H^?p2bQsrwdnRDZf*`r>taxm~7fSt2}vGf3l_;M!{s$ew}X-EN!aVBACg` znp??s6gr*Z0`UWUSPa#L2A#rirh~l=w-U1Po0@523H!hU45t^b0RTxZ%3=pm<^?|q zDt-VDU!d%42V8E=1I_^#^PETEr&OY3BM63DiJ1+i_#@^Medj@k5dS2eA-pI>?1Nch z$bQ>|6w`L>CoY)0tO-9#$%d^?SRnG|#Ctc>;=TK6rKbIua=9Eq=%=710Q@3LM}dkvtMg-6G+{8zj`c zLPEU@2z|Coy{00O3M!g-mWl*UQjtPB6{#FUbZnPEB_gaJWj&x`MphZ(9j45z7bKn7 zgf;k50T#~bxC@a%h*=NN)bLShgn|qjUjNO*8EN3ub9c#!uOX5lPiir-9;diGNBhWP zLJ|+JiW1NGqbIEc($^4f!hxzfU<*3 z&x&r-ewb&3i*j60R@VrtNea@5tPl1$ zO{&M$IFUx$!;KKe25;Dm9$m_*&E22L`HK8Hkuvkxxi#P$?3Orf+F{ycxx=*C5>gzp zA8WE{JvX8`MU#x9+#0GwawD3^QwcIu7yZxXSkJkDj1h<7c}3WnwptByH@)Zmt=DU2}e6?Sm=3 zRu)&LcyT~j=Xa=JiX)T%jZR;vaC{LxzCcl@CbR{wE8_Dl{!CxiD|mf9DvY@D4q`lz z6o!I2p)h(Wrpy^dmew4+;L3F(m>DUC@`W6^?#lQk`k=?!*n{nCRyozucv(b8AEe{q z1UIO~wP`wWy~0Tf4{AnZ+hN-2l||&RYS!t6ZA)-CxuR$(A6HtDT4VhSz9H7=V&tNdlMBXp ztlLlxo<$jn_wJ#bVB>J#yv6XYPU&4VMQ*rAB0f#tU71DtZ=0L_4$~g=zF73Wl!*RW z5j_~?aXzaPzX%6oM=D0nz-LSNOuJ^8cFyY5>5dqgZvoA1qY{5aj7%vhY+{Y-Ox7g% z>8?rEBnDhu(Mh-pHz@DiqQX2XETF;%R9JzK6!iZd|JMWme|q3otuU&P~EJV}J%g9v}(`1vE4Y)1CtI0ha*jfc3y123!CX z0O|p~0MU2Cv=tJU||x2ABsh0hj|E0Um$=z*;~oU>jgB;27XEAP?{qP!DJa3;={s zUTMHoz#M=Xzy%No*bX=f$OK#f>_*w&24O! zx(?!LwEu|!k8f~TINO~Fdb)@E1qab0g8TwQ0=xsggTlSN*gg?Ko)mgm){e5Fs1Ty8 zpr+xdG>;AYp2300GL04%9vte8*xS=JB-GoLLVE;}w3jcTdwWvnVeUAO@WXk~D!(8I zctr&T1beQgd4&bjyu3XkR=Ebc2LPi1J|bytW8~_AqIvlRts;6tz1_XM{6cA~yu-u1 zL)Usl1-Sy z`Jlcj9zyqC=j!Di?oRU#4W;Sonp#_1SnKN(0uEms50D11 z08GG4XV1{6knmt$6yWDE)00N!9{EN+y9fGt(rjqnv{2ewnjg&*XDT!`+B&LS79rk2 zXt49x3yf@ymJYX9v~NWPFEq75I@=FzGc?FOfDPvahbpt(!_W*!GiCd@`vrJ=&0~`u zL8FBPQ=IHcdTevMrAukUc?!G`@G{tplI^7HW_DC#h~oOks5tMycKuaxjK z;$b_DFkTG~6>Lvb5VGKjal*qLLkDe z{K!Bu$UB4|%qKEqf5mHKX7pe25uM;w|8JNHFFC-kqM#RANiWTB3>dtQC+@xldxU*%KXrQs|~SdM%1TnlMYL>e!-Tx=3i+>{Szfd`Q8{#P2Iqd} z5})yBLsFI$WmyH3j^pfoEanSEVYMtkx3 z*X9DW$nawd3DK~iT|{6%zh9bj;j>NC4Nk`7E%B!@ zAAc6{X?}2sDe>#}Yt81wx9@LoUlRWYCvW&pe0=rb7#-qgO^H$k;_LlW{hkqjS1taQ zMtuH3!9t7pJ?G{26ykgDV;3Tc|0DQjIFUMtZ$2GF>fuG7(LGWZIX2?)q&~76eZG=9 zVQJh@A@yP~sqZkUn`Y6Dd{RF}yUyy7I#M_zw2#zNa2$UVsjHA6Q6W-a{i;<9NS#eB zpXyBN?aTBB%SqieUO#Z0)L(<=fqVyzNLmPiL=jAa#A~`CScC-({6mw@97aWE)wL zdOy;(vys&OS+mr4r2ajZmp>$J;PE!252PK0eejGVZ6WK{wHneM`mc4YByGY?b?ki7 zE<&?AGf3NL*Y+Au+J~a7=M>ULTJOa*kai*!RdS8Al^HgnA4q#S=05fFQ~ha=Miv!J zD!sMkxolh0lbTJnpVvJP`Wj=g>F1r`v7zTzb&fcFxGeMGCQqSDBERz)hYiFhER-3o zIcm*>giVYoKO^fD_sN$UZpeP5k(XaCC6u40yHtdA?7^yu^K*^$ALqY#xO957cmFY^ z7^n8$nt9p5k6p()E?m5QoJl}{caXlG8hh$g%vV9Wdem4I=C|HE*hkSbe4UCuE{UkI zYj_Uu4RrT(CIN5A_h;+svHw4$V$r^>7g?IBEHhD`qxN47Av8LjkB`9^Ig-g7HA+N8 zRFuUUJz7d?%$RZG#*degk&|Pyr%X{$m^xKSY5H_!WmQ#mbq$T#v**s$($dk<)6>^C zG@L)*)O5juMT-_MUb@u6!ph3p+Sb;=!O?NWij^x}T-@C~JiNSCt@8Ccpbzl=1|zy$lU$SNH_>m1@nV*&wL_ z5VH{@O-GuJG#zO=n+;ht0Ae;`q(KKDMw$*WChUQM#)Lg4(t=0}A}xrtAnbt-Kn#1J zGeHL+Mp_W|n6L-MkVTBNAku4+6*}4L=L16QmKd z*?bJ30elQ30Z6lv1|D<(A0YzxX!3~V5%U<4h5+^hXMhgiV}K4o8gdNaK?lGdic6zO zKrIU(0i&cEkVedAOF*35evp6|3xG5mY2ZNzNWeDv1d0S~vj9j#jsd(pVtMd^4v>It z7656;fezb9gAWIt1W-Z;;GiRoe+FU(on(+7KnltaK$?y;@C?KZI)xxi@C==Ji;r|^ z$n!xSzy})nIy8DYV#tGrH0kw-A&;6wfC^?HW+0{sB8>`WAZ7?clnHxG*h9=fOe3Gh z1)hPJAqaa+*ki&TV#xDB9)L7r$b$xZOxQyVdC-ss9`XR#!vU9*oX`hbBGOc*kR~J= z3jr1mXyU-*l!-JGX(rM*cvVE4M`w`&01%VHAPso{VsXUcz#|QL2IK*xYEdFo8}TTO zEz=$&O$7XSR8nynMgB{W+F{F9@R=YpDsZh06-d zu+M^h7VIMpKn(jxBlG0I2!Vk7^Blk=AHe_sMe2tSbW$&Tpd-yd8Zm%06XH3HC{&|m z(jf<6;(iwm06NtfK&Kid=tx6O5HWz5B?g3uA%GCw z3kHI!8kC*|I?{Bcfd>tA8jTGMfToBTKx2anpeZ6&1RvZ^2Y}839cjn`Ku4OmXK;Xl zZGHf87e9cwmLE1iXQ9KhP06ysEhYiqKptC?{ zfsQof0H7m{d{PH$3;!6INp=8;sfxf*3j`YpHt1~7kp>_J9cdn!jQWI?!I%to0AdDW z(7^ye3_AEHBMm?dI?`|}aXn(_XF@-50cmBt2EZV01t11p5p+^Sr1_8rFxcP+AclU( zPevMm82XWBgCBqxbns6`8h{vdq|x$GT++Hp10&~DjPx)LWQvD0K$16#2YeLIpe!#U zz2qNWqJl6ZCOQZ|QA_Ed&It_%B}4IoIFuhshRE||c=AJeBeuyuhI7Kt>%Am@RNkn3 zQbvh(qKL>5^JMrZf86!VBD>KB6O*;CZ+~Ua$}5hsX@t;Nb`_l}E}hVI(pD zO2^;wPIn^N;n{)Y2I*%{Qw%PVE? z-~99PI+*W4yTl*^bD<$s9aM80s#3TK^E57Z2@U6j13=CFR17>-l@t$EErf$=Y0yVx zsj472B8g*27brw8bQuyJf~WNI&I#3!SR*!ZP&A$fqKjvfk|Fs5A2}#pR5^$~UVeEx zNM48x(K%G6AsLDTI*8gq53(6_CYwgb=s{!R93-5B#>N={c$^a&#Y1Q~C_V~DXh;vq z@?_XRQ8GN;NKyI+dC56!@^tcO|6z~hZOAUq9xq=6NA&aZL(a(o+Hl^W69>vb@;qE7 zB17>J8hB|;LmDmCkirrIn|BU^A)6LUxDf-`v7pg#ASV12Ef#p7C>|mgiv&s145^sX zMR;O?1VD~GOd~o8FNGsC-Z{ZhazNn#9U-AXC(!|01c**HIR}35oT3qZgde=XgNlO< z9^ec?gG?-sM&XFASV{>W_%N?B;1q^200J~)0Ph&QWI@7^;vqCTbq+ZOks7JQ|fx-Z^ED$^*%VF?0{=7|aX7 zk-QA&Z!llH{2LNy#jKGfQktoI3hcQ1BQ~NWPm3} z90}OqBeIYo{INihOb+Shr4fQoaD+x=$U$t8eDJP1h?XHa-Z{}3$L8rId_<1QA2^8& zg`@FgsJ!5u*dh7gym0g4zggPGn!C+^#R!FpxC=A%uSAUcd99;)`h|It^Vxua zVBY<~;dLemIeQ0rx{|v&SZexz;Uh!+!hx@8k^p||Iqxg~DovlEtTIzoOgWy^Ishh7!(|`CNwNOVr}HQsP)$K|GTwf z>-qoPeS=WX*^2P3^3XkpMJA^I)y)AvFK_qZ8x^RJB!2_>YGzjA%x&XFn}mh%Pu3DV zS*d

p|-Q>pJWA*8SE(Ymqf%y~o;T-C*5l{mJ^cRcd|0DzhrA zlUAj*pVQAvtXHhl*2B#EEVbTl-E37`%dF*AUTB3CwJr&*v}&wctB#Y>pR`tU&*G=8 zNug8L04Ju`SZl4vtqO|hoQ>~!i)Mi#g?$O5S) zPb_4{_)-YRZ*gv@R8@aM_xCu+jN2Bu9$lB)-IYz3 zm~Jz>PQAs?%9~efTxjVRfBWgpXXOb)zK$gdr6Yt1P;*>+Li!;k#5f&wQG9B8e-pSvA(!XI)zM zU4m?Sf0kDaZhY{qFNmH8jXb-n$V_hS^FvUw7sJ&44_P7#ILXp{tZ99kua>Pby|F78 z05nl3jy1MyO=H%VL@$kLE}SQk^?L7|MNpc1?jw!eYzB;F73I1$^O_dV=1I>Zcmb$# zxjuM>)Pu&UtP8I1%Q@IBEnfEef~5pCk2IfBdE?V1Cjxoq(_ML)PO?2An<$}Y6D9QQ zqNo$8ln9#^UwXOwhJXyTSyVG8IOhbbl;q)Q!R{;|KFhYL;xDm0cU$ z50L5T9f(#m-{B<|TY zTU=zOWrUuJL$*yOqf`T7PX#Q^ubg*Gi-0t@q)2b92u3Wk_J}BUX2+W2*<&Sca;#!> zS2mZ9;;6gdgMphYPK&3T>*=*q_5r5$BKiF3o1gQ*df%ocf7)y&9vL=NPu5II)d=|0K^Dz8m4 zj!?$f2PBdBo3<0l=W=K_y7_XMjzNs@Oe!N4&Sa=ib<%m!5gr26ln1YYNcH<8w_}N5 zvk^?6%*j&?uBjt^_@(aN$RKTRp}26ELVbZ{HfL$DB@Ofm;Io2pQoTW&CG-MXMIaoQO9Mgts z5{7g@fh~(da@%@Ox&7cq^Z@~8e{>e0F>lV1`k;5en-i|vgQ@ejP}4Zcw+ov%7_-q+ zX0OwBkJQjoNg-?|9l`)&tu86?prnw-i=hIIZfSA#o|uT zgPtS_wk%yiN~)2NrcVTW)llrF`NK0y7@8Czdif#GncG&CHnI*X*)%B`!h+RAxLj3{ z$I%8w;x(=K_8zyC^rVC2*kQ(Ah7@2)Z1}$AqfH@_FO!b?D+xdW&M#!98p~h@s^IiJXgG)@c zSHhA$^`I=-yaighEqt9;Pss*p*}^JGXGr&yZEnQS-1r$wx~I%-OPO2wXpZOljW!ly zWloA`&fULZemX=%Lfg7!G6c~E56&}2f?=3~Ga0Dn7jC=9kkV0mT z4B;nS3J;JJEHZAuKUn@Jc&>gbCtUi$kn#zy$jBCM1fJI;+~U6@TnY2_N^j?7qo+^s0ISwIp9^5rYvIQS~Yly_#H zgqy2;W666-`Obo`YD{@2;48Jp=Y;Ml4P8Q<VcHU>!k-tWR0eOEJRt616H`(ffgitZ+Ykngv~mJz|+9TsR&2G z-vz!0u;s-1KKL1cM{Dmw-3vV~6l%yhOEWuVc={%MyWqnMd;??hNj;>v;JYbD>W%!e z)kCS*xh`LsVbi*r7N6AD@yb^*X1JZmo1lEV#+26pU!L&YlT4E* zbv78kI`}5Ke3!WC$X2f_;3Gds$2~dsxO|!QTFA5En+#uW|LEZgUm<+?F5hV33STaK zQ-m)(cDOHHmlK`}U(RcUdmO$3mv5|akHAOe9hWmkxFOh+Byy&A9)>@mpgiU zAbdyRyHNT1$80wqhwm!*LZRgNd&DEZqzhg;g!TY@#qi~Z$L8A$A6Fxwf1~qBc_iVR z3tu>AY`!-5N`!BW_=&uA@XZsxys_m);o}mdwDf9&jF4b@7r}Qee8Kc)_$FoWWlP7)Z=;`quay3LtnxSkU%v8=uzjdW~>;M|1|IG*~j-fwwHIB*I|4w?=#unE3W-Jf9w9v-$}+@Cx91# zki5T)3xykiC~)wom%0l7(8$-+!Qg5#vBiv2Y?YdC-*a~#5ob-$` zUlI{{=bCW)pB$+d*}@%DFaC~j2mg+6CCt|=z2VuTr}yBy{?GIxGoM~lFaC~v^7JCJ zd;=e~niFm~H%IxS z({jSmDLLVTKtyPz;5ZpiB-mUKA?XBuQ-fmF$@piS~W8>}lf=`UMiv$miw{5}J1Up}Fc!GU; zyU?fFj^M}y`?z4Mz&97ucuYEACV6mjoZ1V4n~?IMsee@QDfbA;Civ><0u} zdG>z6{Zs8-g2Q=so8U;ET`jmc&z>*1G|!$TI6B3ip*YXZ7u=9%TY^uJ&U?U}dG=Ak z$vpd@;Ql;&ui$|^dz;{cdG$>iS|o(gZq&y zcwnM^NN}XU-Y@vzM0=ay!HITU@Ue+@RPc$3_9DSU6YW`ot!Z|?;La(wa~C){#Xcf9 zJk5SUurYi^~f{Ulx zLwA59`SwY{#rgJgf(NG9j|wiGYCoVj-`+3SnriPBTwGwc36AF5b?RPV&llW~Zx;#f z%(wFdC-d!>wu1Zf?c;(6^6f#v2lMR*1P|uh{eq9>+X=xZ^6fQ(hw|-G!PXRep5X8l zyHIdsik&aGc#8en1k{5QE(^t5V#om_k*tn_k-txcYs@Q?*tcMZw9{$ zdmXq7Tngq$w>=x20EfXn;L|-h;VobXd^`9!cq{k_m;?Rx0r0!Q`@naCcY(Ko6X5rN z*MRQ=SA#h!YcB#P!NuTvz&7~3;C%3Q@XLvu@DA`v@J{eC@cY1r!0!j|2k!#!0QZ99 z;17VS!F}L);7@`h;N9R{@E-6`H}iX>`zZKc><7Rf1owmc!CS%eaF2sOguM#N5G%L{s6cT`#$iw;9cNzz-{33!0W&>z*XQ2!KL7fz%#%X zgLAh|e+yg){x;YG4}yo7r5UjTmx zd=z{b{3!SccmVt)I0?R-bTxpV!d?abIe0#JD)d?4r?KaPkAhF%mJ|Li_yqWS;3MGg zgAah80q+3+3%CvZ18^1iU%|!TV_+NnL-3hRIpH6H9q_Z@=fLv`?{V;R*zX7b8+bSP zdGJ>7TXAm&{}_8U_&B&2{O@2J{2$=ct;~afPlBhzKM4K__Cw$oz`Mae1-F5(z9 zPwex+{{;?%InHdq9M1{=4Eu5L*}23Ed}bW^2A+;R3AVuv;B&#H;PK!Y;4t{iM(P9j z1@JWRAo!2sAAAn>ZQzs0UjzOnxD@;=a1nS8;pc*{1i!Qa|KMl9SAh?Je+^$h_;BDZ);;#W*h`kDY6L>b*A)H+B zFTf|8|DX1*Kfdc}|9_V02OrsGG#b`giPoI=`St#F&ilP;7r&V^kIiv)Fi9qa+HOJHMR%V7_M z4Z-$@&4nERt6&Ghroaw@4ZYnR z+Z_jRoHY@%;#`dPlLL|YaZU@Ii8*sFhMj;Jb6jBkQhCO1bBd8uAhjVjQ2p` zD$EHK6Bv(kW?*ie0-Qe&cT<3^DbY*hpf#qTCC|jsDL8r#{<5&0jcd)q+&q{I6xU6~ zo+8*V&T=rr&`Fq+C-RpTov|nKxjFa?MYm_;{!WUPJuxr@*Y3U743sqorA6vcjFP6~ zvooXT?SJiaaIFHIHwE(qCE;$Sqb{?fd*(&YPeaS?Eq5Z$i_93bw>*OTu<_5rokU&~ ztsE0=t8nz(nJ6ptvsT!1?^CdM9%fCV(a(&-oI^2amB`&r!@oVB>8(p-YflUA|JgL$ za|nNtS0++XF+a9sA?7oRwB+w;`y8~)ER=B>t{X-4uAPPY zPK(wy;sM2|-=6wJ`VzBk{>Q!~%(#>kFwlB7T5k-lOz9pI2sur5kD^2$3F+f*2SsfM<-+1UuO=cIhau}XUvT0m&~3uXV%p47|g8X6wH~CHrGhT63R2DPsQSn6ZibO zQzsi~B-uOUprj;)-^=1B)R-!FUUd6sd%|OXyv~mYaH#jnr{M$P>0vBWj2UZn@|DwP zGMbzenW{-A|FQQD(k70_T)gAY&PncFzg;I=X(UY$Nnn#B%WFnvik&rk>}>qHJdD+6 zu(YC1F0mwzMHiaJ0%$q2E}JqFH$3$cYciW`7Z_6vYYLm3?5UIXznk6)oYY&VeQTh8 z+8?d!-p_m4W3#b{4OV)~&HeE|ecOHQ(dQ3+to z==s24GK_eno&1~JZM>&Pk{t0iEozgXJYrfUre%9%BQrt?n!FALowMf6I zH)+S4@2&8pf4+ZfL~JMRDeq8{O;(UBqs3TG4`71b!N&8`IhA3#Qr5~kSuY!8qimAR za; zrFz6$=N%EbMmm1$26HmGfD{;)86)W#^l{oqPi2?0zq0fBEqpca;AujL0#PIeSd*+z ztzq`%_Iqxu8mNLQPQ|MPHCkP+K2~k|JAHs>_z(My{;QF)(YPo+5GIe13yn%+7&Yiw zl=Ag_8^2f#!Y?K%+vBK7HJI9`H*V!OER|{2zs#FiFd|j=# z=_5VrnckV+Fn^*y-+#}C@P(Gd+H>S)@+ui->@rrdr}%Vnzxcao6JLor@=OHAM0+tQ}^hA7wZl5{j(5qFCh#SQW? z`K7c`w{Ofr)@thuE5*LT-eu2n9(LYz&sCGuY~1gY%GQ_a{@w_0yjS2Y_P+Mk`kNws zQHeDwU@jovkv|&CjYH`Wc08ZYU*liFi?YN#u|f=ym%v9~liHeX-DkaLU28vKZ?SFX zMknOn?7rX*Q7QUVU8EoO)_7<5>-z)zb>vwimZs8E=yP;4tz;Y7 zV15Fh%J1QKi5ijSOmHrCYMnZ#-f3_eohGN*S?jbotxlV>!D)9Mb3byASBL4F^hQh} zUE$Y8u26^HtfPE<*Nz-UP9&4aedKwJ)u3^nQD_tyA*0v`8zn}mQD&4I3yli+S(Wj+ zkwtH(Z_y6=5&bt!VbfR{Th3b9Av}lY@;si;3waR_@nRn4CA^fE@p8V9@8E;QN9Kdp z)wXmmb2qxF=#%nlY4C)9v(X_Aq;Zckyp{y2ucjXv1ugBXUKa z$QOkeD^v^UQSv<5I|Hdd-JZZ?{Xb;bwA zPGb;Fq?6buY!}ZF6Qt$LcY2&--3)hQU!#QT@3R`r=G&=2dY;l)+{eg0Ga8jQ6sd`#UP zoyWo#P$B7}LR@8}l(I6T{lV}!eMT=;~c-tV_ zMTh7VTSS-GCc4E=(IWyfRt}Uw87J?-$XO?sn&(>m?4j_wfScpabDsc`x4NVCHQu#; zz5jCLx=E4jRv^IXQsB179%0k?OdfLXgl}$fx}0r@06Wni0XNni=my<5H{MNf6Wt`# zAw~^TwJK9zrPt^M{%d{!U(U=%S)0g3#zV#`V~z14-A!HgE=%Kg@dw0W+|lc1oB6i- zLB;7jov#ZqvO>C8hjocA)n&R|FVq#fQWtnjJQS236P=o`VQuU?b{SvGrTCXEoE6T?&gahI?g{QRcd478 zMgr}Y0J$x_G;)pnm}p+>NRmXRk;_RHSw@0vBx7tLyA7>zJU1{}uIJr+H+SXj@@_fL zWR|vy?3s3n-RWGX*XuxWOf+VVB&*3<@)r4$bd&E%tTER(oF>p?=_q;%Yhi8tJ3dBS zELMpf;tz-eXUVJO05i>e-ntAuwBDVmo>n9DMfw)~l-{fl^zywrAVRADp}#fKPh~Mt z%tM!sg^`G^dBRvPKjETm?3C5jtj`)YTTdt8?<=y6kz}+jXd#n$w-FBt(p|jPg zMpUVBSGu)som&roYIF}&6j7x>CBvWdb&YNUPxwrKs}J{>cd57D4=j&~W^$im&FpQq zg?-Bg@dTdC3HNvwpT@7_Yxw&-S6nFOie6|1#4o-^#}5{KoR^Ax^rJ<6P@hJ9oQhpf^5M{q-z;w$~3#XQ{v3 zf5>0uKkYy7uk~N|*Zb}M$Np#jcK>@n&=iA}5b(@_3?he<1d>dSCkFC_0EjPZK3VJ>qA%yJD*Ku_p+7jarP1WlEtEp#_*GY z1GD)u{t$med~E(;K5zGT4so_Sr@Fc73f$ucb%Y+KEuHSI_FBAluglxv#rXaGVZQLk z`Dglh{#3Ng0>9G#yZ@s9mLF)1iO#ulFgb#ZB&U&c$gQM?JW5_9ui*|qCjE>fjN^Ur!l84F@CBaxyU{xV`xx7+d zBj?K-IuqWsWm5%?W0X zImyg7ry>j-P8HOv}i zrCP+|mSrg`-O8{stt@y|j+JZWS@~9>Rb+*%Vz9G;cF>Nq``{AO>Ayk zwzAXh3_H`#va`Y9a_u}j-!8O^?2uh-hk-QdPKJ}|WI5UJ&|D|a$#)8!A}8b&J7K59 zDRs)6a%Z7a;Z!D7DBcun4?-ZpQ$w+r4nz(2%4+&{`c z&L82A1}iju?T`0QgZG~6U*H$`)BG9!V*f6Gg})MrRqsFJH~FvlE%4?I{${@u__)pA z;rDcPAlNfY^XRNa?(EitOWE^CaH7$tQ;nFeF;n5d#lz?_!T8oH9!(mGm? zG15qzXfwu13vH!q5gA$$u{N-F*1u}j3r0rC)e zxI9W8Cr8N9(vTKLPP)vHnKDae%N&_2^JKm(ltma##b7WcvQ(DIa=B1e$Vyoym&g%j zs%e;}se#Ll8ad6Rjod53wIc`steDyXw(%@@tJ7&EPi z{2R=6v%~B(x0qe#HnZE@Y4$+9#aaWcpcQAuTM1U8m1L!0JUtC{^s@Du^|f`o{U$Ik z&spRQa<#k6-Q}L7{;3Ytr|8-6yy5VuHQrJF#qf}>2>x%2iLS9boGc=1$g$wc%Z=}h zG3bGAIu`2g74|g?@q77E&`%GdT}GmYPsrisRpvU=vSwM0;7hOBCewl%nh*D7|%EdxaAu2_cSR!tdkDAw6i>zfF)%c!<+=?SSQ6f(IJj> zlrs)!HUU^R2}m{-I5rz7b}caMMj+T?MBo+9O6O5%rf0xiUx8kF3oW}DYi$TTsFI-`(x99j=;l+Pn$L!2z6gr>Qt0KmP|Mdt zE8n83)Zf%{bw60}4cJ%TV^@ZwI-=nAd>!3bNC+K5!iat>jEw$3) zbf%u5bMz!Irm5h-v%!F`1^>Mf>~}HL_X@pIKdS5XGhkD%=obB!-T+qEskcIx?|`cA z2TeT~`HiEI-58172K6k@^D?~Cy=-rym*-9PioBU#*t-gBZ-H0gJ@38cZSaQpN&X3b z8koTZe>$|xRsNs-zk%5_08QTqpTP)9!Wz!-`vD{fCNqMJCX8f}v&j_T=9OdtSxW8! zLcUJg$h%}S`GkB=1T1JAn~qvXfaho5(I@e_}U6Yd+3iU_0RDNAu(Oll&## z%Ncwq&-1|+SA!Y+OY9a0%OSwD<0X^l$&2Nsz^=I%*VhBLB5O?tQJ<9@Z|PW%45ppN zvQ(DCN?8rix0@yM4Cvx2-pD(7P;ju2a%iqL=&2OoVpvuqYt<#=!4nG23b257GZyha z$11gItQIK6L`3co#zLdrX$Ku#pbTrP!Gysg8o?L>QG6Q})gj~8z#3T-bi=-J^7qHcbo6Z|R7Q3*3(^7|mk72Q0wy*> zI|n64#4AUJvJF|Z6f?^VgY7jVI>m#@6Oa(dyt7@P?mx{+2F9dU{*X=qM<1@!A^=iP-yS)TI5u-509|dj4p!wqNw9|3-qVYmq%}HQI~~&>0=@#Vtmc zu?;!kokoulps{oyjfe6`q)9XdnmUyd_^JiONv9dWoGh9R)X9bS=F>tTPly)(q);lL zPWJWX|72qO`*b(m37q)veLBR7_wnk8PcMf*|C%rVZ=7#0-`m%h^L{0xSHUZRWlMMs zU&(8E9k1sNK(;2{jEqPNZ{=-#18+xuyA!$eE@Y*<`A+DvfQW@M3yL_A2xXQcMnRhq zV4)?HNdJvo-(IFs8RZ$(VmY#&wa8dCAY0Y)J2F-AGC?NFB$*;d$yBI04pzD^A1wlw zm;b~-m&=;yGlhCQPiV%ogf`iZCl+0@8zVT@44Uy~qL~7g%7NDz7|}Uq9&kH^kzEQ! zS7BCRgx8q0!0|?m^cJwvb}-T|u+bjidJrr$5ezgHYEA*Mvw-t?K!Om|Td7qJM5wZ= zf%~;UhDNIy_}>PE=mdl6wt9dRL8!Y#D7#c}Cxy6>1?0#BZwf)hmD=TY1>!_CkfheG zN4#hTqO^f6bs}HiZTHx*U`p{$B6w1&!@-g=p!jmYeG7p&VW_-vD7-4LqZ(wC>w!Sc zU`B1o)O8|L*9}$_iws>nvU4e5MBG*2Ls{UVd2XQ_0v9R;QdPKBZZ&vNEpj)F(1a~O zu6Ag_F6h7>@Sh-_Z6qRhnhNft@WdbsPYMe0lpqYwQ;w$tRlv6z@SS?q2%KwCZQwec zz`JhMqhi5x;&mcePO9d>zYLuPhLZ;z3?ai;3U*VWtH5n)bS-ePQ8$Cvv;iMG!Q;EZ zX=3q|ARbCG1$fCl1vZlf+|2U|y%3m8saFmjQ{`0yM{A)W8@*=WX&Z7LoydB0dp%yP zAN1pat|?JuRepw_1!TnFCKV5Rr2bjSCTp!-&M?P>oekj5Sb;^@zaDh`w!zyq%;ADA|KtQxNes z5qY{)87KUo~z4}_9uLb^(x4{1Zi18eW literal 0 HcmV?d00001 diff --git a/mswin32/OpenSSL/include/openssl/aes.h b/mswin32/OpenSSL/include/openssl/aes.h new file mode 100755 index 000000000..e6fc44a24 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/aes.h @@ -0,0 +1,138 @@ +/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + */ + +#ifndef HEADER_AES_H +#define HEADER_AES_H + +#include + +#ifdef OPENSSL_NO_AES +#error AES is disabled. +#endif + +#define AES_ENCRYPT 1 +#define AES_DECRYPT 0 + +/* Because array size can't be a const in C, the following two are macros. + Both sizes are in bytes. */ +#define AES_MAXNR 14 +#define AES_BLOCK_SIZE 16 + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ +struct aes_key_st { +#ifdef AES_LONG + unsigned long rd_key[4 *(AES_MAXNR + 1)]; +#else + unsigned int rd_key[4 *(AES_MAXNR + 1)]; +#endif + int rounds; +}; +typedef struct aes_key_st AES_KEY; + +const char *AES_options(void); + +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); + +void AES_ecb_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key, const int enc); +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, const int enc); +void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_cfbr_encrypt_block(const unsigned char *in,unsigned char *out, + const int nbits,const AES_KEY *key, + unsigned char *ivec,const int enc); +void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, int *num); +void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char ivec[AES_BLOCK_SIZE], + unsigned char ecount_buf[AES_BLOCK_SIZE], + unsigned int *num); + +/* For IGE, see also http://www.links.org/files/openssl-ige.pdf */ +/* NB: the IV is _two_ blocks long */ +void AES_ige_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, const int enc); +/* NB: the IV is _four_ blocks long */ +void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + const AES_KEY *key2, const unsigned char *ivec, + const int enc); + + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_AES_H */ diff --git a/mswin32/OpenSSL/include/openssl/applink.c b/mswin32/OpenSSL/include/openssl/applink.c new file mode 100755 index 000000000..54a0a6426 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/applink.c @@ -0,0 +1,94 @@ +#define APPLINK_STDIN 1 +#define APPLINK_STDOUT 2 +#define APPLINK_STDERR 3 +#define APPLINK_FPRINTF 4 +#define APPLINK_FGETS 5 +#define APPLINK_FREAD 6 +#define APPLINK_FWRITE 7 +#define APPLINK_FSETMOD 8 +#define APPLINK_FEOF 9 +#define APPLINK_FCLOSE 10 /* should not be used */ + +#define APPLINK_FOPEN 11 /* solely for completeness */ +#define APPLINK_FSEEK 12 +#define APPLINK_FTELL 13 +#define APPLINK_FFLUSH 14 +#define APPLINK_FERROR 15 +#define APPLINK_CLEARERR 16 +#define APPLINK_FILENO 17 /* to be used with below */ + +#define APPLINK_OPEN 18 /* formally can't be used, as flags can vary */ +#define APPLINK_READ 19 +#define APPLINK_WRITE 20 +#define APPLINK_LSEEK 21 +#define APPLINK_CLOSE 22 +#define APPLINK_MAX 22 /* always same as last macro */ + +#ifndef APPMACROS_ONLY +#include +#include +#include + +static void *app_stdin(void) { return stdin; } +static void *app_stdout(void) { return stdout; } +static void *app_stderr(void) { return stderr; } +static int app_feof(FILE *fp) { return feof(fp); } +static int app_ferror(FILE *fp) { return ferror(fp); } +static void app_clearerr(FILE *fp) { clearerr(fp); } +static int app_fileno(FILE *fp) { return _fileno(fp); } +static int app_fsetmod(FILE *fp,char mod) +{ return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); } + +#ifdef __cplusplus +extern "C" { +#endif + +__declspec(dllexport) +void ** +#if defined(__BORLANDC__) +__stdcall /* __stdcall appears to be the only way to get the name + * decoration right with Borland C. Otherwise it works + * purely incidentally, as we pass no parameters. */ +#else +__cdecl +#endif +OPENSSL_Applink(void) +{ static int once=1; + static void *OPENSSL_ApplinkTable[APPLINK_MAX+1]={(void *)APPLINK_MAX}; + + if (once) + { OPENSSL_ApplinkTable[APPLINK_STDIN] = app_stdin; + OPENSSL_ApplinkTable[APPLINK_STDOUT] = app_stdout; + OPENSSL_ApplinkTable[APPLINK_STDERR] = app_stderr; + OPENSSL_ApplinkTable[APPLINK_FPRINTF] = fprintf; + OPENSSL_ApplinkTable[APPLINK_FGETS] = fgets; + OPENSSL_ApplinkTable[APPLINK_FREAD] = fread; + OPENSSL_ApplinkTable[APPLINK_FWRITE] = fwrite; + OPENSSL_ApplinkTable[APPLINK_FSETMOD] = app_fsetmod; + OPENSSL_ApplinkTable[APPLINK_FEOF] = app_feof; + OPENSSL_ApplinkTable[APPLINK_FCLOSE] = fclose; + + OPENSSL_ApplinkTable[APPLINK_FOPEN] = fopen; + OPENSSL_ApplinkTable[APPLINK_FSEEK] = fseek; + OPENSSL_ApplinkTable[APPLINK_FTELL] = ftell; + OPENSSL_ApplinkTable[APPLINK_FFLUSH] = fflush; + OPENSSL_ApplinkTable[APPLINK_FERROR] = app_ferror; + OPENSSL_ApplinkTable[APPLINK_CLEARERR] = app_clearerr; + OPENSSL_ApplinkTable[APPLINK_FILENO] = app_fileno; + + OPENSSL_ApplinkTable[APPLINK_OPEN] = _open; + OPENSSL_ApplinkTable[APPLINK_READ] = _read; + OPENSSL_ApplinkTable[APPLINK_WRITE] = _write; + OPENSSL_ApplinkTable[APPLINK_LSEEK] = _lseek; + OPENSSL_ApplinkTable[APPLINK_CLOSE] = _close; + + once = 0; + } + + return OPENSSL_ApplinkTable; +} + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/asn1.h b/mswin32/OpenSSL/include/openssl/asn1.h new file mode 100755 index 000000000..f15131ea3 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/asn1.h @@ -0,0 +1,1278 @@ +/* crypto/asn1/asn1.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.] + */ + +#ifndef HEADER_ASN1_H +#define HEADER_ASN1_H + +#include +#include +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#include + +#include + +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define V_ASN1_UNIVERSAL 0x00 +#define V_ASN1_APPLICATION 0x40 +#define V_ASN1_CONTEXT_SPECIFIC 0x80 +#define V_ASN1_PRIVATE 0xc0 + +#define V_ASN1_CONSTRUCTED 0x20 +#define V_ASN1_PRIMITIVE_TAG 0x1f +#define V_ASN1_PRIMATIVE_TAG 0x1f + +#define V_ASN1_APP_CHOOSE -2 /* let the recipient choose */ +#define V_ASN1_OTHER -3 /* used in ASN1_TYPE */ +#define V_ASN1_ANY -4 /* used in ASN1 template code */ + +#define V_ASN1_NEG 0x100 /* negative flag */ + +#define V_ASN1_UNDEF -1 +#define V_ASN1_EOC 0 +#define V_ASN1_BOOLEAN 1 /**/ +#define V_ASN1_INTEGER 2 +#define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG) +#define V_ASN1_BIT_STRING 3 +#define V_ASN1_OCTET_STRING 4 +#define V_ASN1_NULL 5 +#define V_ASN1_OBJECT 6 +#define V_ASN1_OBJECT_DESCRIPTOR 7 +#define V_ASN1_EXTERNAL 8 +#define V_ASN1_REAL 9 +#define V_ASN1_ENUMERATED 10 +#define V_ASN1_NEG_ENUMERATED (10 | V_ASN1_NEG) +#define V_ASN1_UTF8STRING 12 +#define V_ASN1_SEQUENCE 16 +#define V_ASN1_SET 17 +#define V_ASN1_NUMERICSTRING 18 /**/ +#define V_ASN1_PRINTABLESTRING 19 +#define V_ASN1_T61STRING 20 +#define V_ASN1_TELETEXSTRING 20 /* alias */ +#define V_ASN1_VIDEOTEXSTRING 21 /**/ +#define V_ASN1_IA5STRING 22 +#define V_ASN1_UTCTIME 23 +#define V_ASN1_GENERALIZEDTIME 24 /**/ +#define V_ASN1_GRAPHICSTRING 25 /**/ +#define V_ASN1_ISO64STRING 26 /**/ +#define V_ASN1_VISIBLESTRING 26 /* alias */ +#define V_ASN1_GENERALSTRING 27 /**/ +#define V_ASN1_UNIVERSALSTRING 28 /**/ +#define V_ASN1_BMPSTRING 30 + +/* For use with d2i_ASN1_type_bytes() */ +#define B_ASN1_NUMERICSTRING 0x0001 +#define B_ASN1_PRINTABLESTRING 0x0002 +#define B_ASN1_T61STRING 0x0004 +#define B_ASN1_TELETEXSTRING 0x0004 +#define B_ASN1_VIDEOTEXSTRING 0x0008 +#define B_ASN1_IA5STRING 0x0010 +#define B_ASN1_GRAPHICSTRING 0x0020 +#define B_ASN1_ISO64STRING 0x0040 +#define B_ASN1_VISIBLESTRING 0x0040 +#define B_ASN1_GENERALSTRING 0x0080 +#define B_ASN1_UNIVERSALSTRING 0x0100 +#define B_ASN1_OCTET_STRING 0x0200 +#define B_ASN1_BIT_STRING 0x0400 +#define B_ASN1_BMPSTRING 0x0800 +#define B_ASN1_UNKNOWN 0x1000 +#define B_ASN1_UTF8STRING 0x2000 +#define B_ASN1_UTCTIME 0x4000 +#define B_ASN1_GENERALIZEDTIME 0x8000 +#define B_ASN1_SEQUENCE 0x10000 + +/* For use with ASN1_mbstring_copy() */ +#define MBSTRING_FLAG 0x1000 +#define MBSTRING_UTF8 (MBSTRING_FLAG) +#define MBSTRING_ASC (MBSTRING_FLAG|1) +#define MBSTRING_BMP (MBSTRING_FLAG|2) +#define MBSTRING_UNIV (MBSTRING_FLAG|4) + +struct X509_algor_st; + +#define DECLARE_ASN1_SET_OF(type) /* filled in by mkstack.pl */ +#define IMPLEMENT_ASN1_SET_OF(type) /* nothing, no longer needed */ + +/* We MUST make sure that, except for constness, asn1_ctx_st and + asn1_const_ctx are exactly the same. Fortunately, as soon as + the old ASN1 parsing macros are gone, we can throw this away + as well... */ +typedef struct asn1_ctx_st + { + unsigned char *p;/* work char pointer */ + int eos; /* end of sequence read for indefinite encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + unsigned char *max; /* largest value of p allowed */ + unsigned char *q;/* temporary variable */ + unsigned char **pp;/* variable */ + int line; /* used in error processing */ + } ASN1_CTX; + +typedef struct asn1_const_ctx_st + { + const unsigned char *p;/* work char pointer */ + int eos; /* end of sequence read for indefinite encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + const unsigned char *max; /* largest value of p allowed */ + const unsigned char *q;/* temporary variable */ + const unsigned char **pp;/* variable */ + int line; /* used in error processing */ + } ASN1_const_CTX; + +/* These are used internally in the ASN1_OBJECT to keep track of + * whether the names and data need to be free()ed */ +#define ASN1_OBJECT_FLAG_DYNAMIC 0x01 /* internal use */ +#define ASN1_OBJECT_FLAG_CRITICAL 0x02 /* critical x509v3 object id */ +#define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04 /* internal use */ +#define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08 /* internal use */ +typedef struct asn1_object_st + { + const char *sn,*ln; + int nid; + int length; + unsigned char *data; + int flags; /* Should we free this one */ + } ASN1_OBJECT; + +#define ASN1_STRING_FLAG_BITS_LEFT 0x08 /* Set if 0x07 has bits left value */ +/* This indicates that the ASN1_STRING is not a real value but just a place + * holder for the location where indefinite length constructed data should + * be inserted in the memory buffer + */ +#define ASN1_STRING_FLAG_NDEF 0x010 +/* 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; + +/* ASN1_ENCODING structure: this is used to save the received + * encoding of an ASN1 type. This is useful to get round + * problems with invalid encodings which can break signatures. + */ + +typedef struct ASN1_ENCODING_st + { + unsigned char *enc; /* DER encoding */ + long len; /* Length of encoding */ + int modified; /* set to 1 if 'enc' is invalid */ + } ASN1_ENCODING; + +/* Used with ASN1 LONG type: if a long is set to this it is omitted */ +#define ASN1_LONG_UNDEF 0x7fffffffL + +#define STABLE_FLAGS_MALLOC 0x01 +#define STABLE_NO_MASK 0x02 +#define DIRSTRING_TYPE \ + (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_BMPSTRING|B_ASN1_UTF8STRING) +#define PKCS9STRING_TYPE (DIRSTRING_TYPE|B_ASN1_IA5STRING) + +typedef struct asn1_string_table_st { + int nid; + long minsize; + long maxsize; + unsigned long mask; + unsigned long flags; +} ASN1_STRING_TABLE; + +DECLARE_STACK_OF(ASN1_STRING_TABLE) + +/* size limits: this stuff is taken straight from RFC2459 */ + +#define ub_name 32768 +#define ub_common_name 64 +#define ub_locality_name 128 +#define ub_state_name 128 +#define ub_organization_name 64 +#define ub_organization_unit_name 64 +#define ub_title 64 +#define ub_email_address 128 + +/* Declarations for template structures: for full definitions + * see asn1t.h + */ +typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE; +typedef struct ASN1_ITEM_st ASN1_ITEM; +typedef struct ASN1_TLC_st ASN1_TLC; +/* This is just an opaque pointer */ +typedef struct ASN1_VALUE_st ASN1_VALUE; + +/* Declare ASN1 functions: the implement macro in in asn1t.h */ + +#define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type) + +#define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, type) + +#define DECLARE_ASN1_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) + +#define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) + +#define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(itname) + +#define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(const type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(name) + +#define DECLARE_ASN1_NDEF_FUNCTION(name) \ + int i2d_##name##_NDEF(name *a, unsigned char **out); + +#define DECLARE_ASN1_FUNCTIONS_const(name) \ + name *name##_new(void); \ + void name##_free(name *a); + +#define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + type *name##_new(void); \ + void name##_free(type *a); + +#define D2I_OF(type) type *(*)(type **,const unsigned char **,long) +#define I2D_OF(type) int (*)(type *,unsigned char **) +#define I2D_OF_const(type) int (*)(const type *,unsigned char **) + +#define CHECKED_D2I_OF(type, d2i) \ + ((d2i_of_void*) (1 ? d2i : ((D2I_OF(type))0))) +#define CHECKED_I2D_OF(type, i2d) \ + ((i2d_of_void*) (1 ? i2d : ((I2D_OF(type))0))) +#define CHECKED_NEW_OF(type, xnew) \ + ((void *(*)(void)) (1 ? xnew : ((type *(*)(void))0))) +#define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +#define CHECKED_PPTR_OF(type, p) \ + ((void**) (1 ? p : (type**)0)) + +#define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **,const unsigned char **,long) +#define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(type *,unsigned char **) +#define TYPEDEF_D2I2D_OF(type) TYPEDEF_D2I_OF(type); TYPEDEF_I2D_OF(type) + +TYPEDEF_D2I2D_OF(void); + +/* The following macros and typedefs allow an ASN1_ITEM + * to be embedded in a structure and referenced. Since + * the ASN1_ITEM pointers need to be globally accessible + * (possibly from shared libraries) they may exist in + * different forms. On platforms that support it the + * ASN1_ITEM structure itself will be globally exported. + * Other platforms will export a function that returns + * an ASN1_ITEM pointer. + * + * To handle both cases transparently the macros below + * should be used instead of hard coding an ASN1_ITEM + * pointer in a structure. + * + * The structure will look like this: + * + * typedef struct SOMETHING_st { + * ... + * ASN1_ITEM_EXP *iptr; + * ... + * } SOMETHING; + * + * It would be initialised as e.g.: + * + * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...}; + * + * and the actual pointer extracted with: + * + * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr); + * + * Finally an ASN1_ITEM pointer can be extracted from an + * appropriate reference with: ASN1_ITEM_rptr(X509). This + * would be used when a function takes an ASN1_ITEM * argument. + * + */ + +#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM ASN1_ITEM_EXP; + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +#define ASN1_ITEM_ptr(iptr) (iptr) + +/* Macro to include ASN1_ITEM pointer from base type */ +#define ASN1_ITEM_ref(iptr) (&(iptr##_it)) + +#define ASN1_ITEM_rptr(ref) (&(ref##_it)) + +#define DECLARE_ASN1_ITEM(name) \ + OPENSSL_EXTERN const ASN1_ITEM name##_it; + +#else + +/* Platforms that can't easily handle shared global variables are declared + * as functions returning ASN1_ITEM pointers. + */ + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM * ASN1_ITEM_EXP(void); + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +#define ASN1_ITEM_ptr(iptr) (iptr()) + +/* Macro to include ASN1_ITEM pointer from base type */ +#define ASN1_ITEM_ref(iptr) (iptr##_it) + +#define ASN1_ITEM_rptr(ref) (ref##_it()) + +#define DECLARE_ASN1_ITEM(name) \ + const ASN1_ITEM * name##_it(void); + +#endif + +/* Parameters used by ASN1_STRING_print_ex() */ + +/* These determine which characters to escape: + * RFC2253 special characters, control characters and + * MSB set characters + */ + +#define ASN1_STRFLGS_ESC_2253 1 +#define ASN1_STRFLGS_ESC_CTRL 2 +#define ASN1_STRFLGS_ESC_MSB 4 + + +/* This flag determines how we do escaping: normally + * RC2253 backslash only, set this to use backslash and + * quote. + */ + +#define ASN1_STRFLGS_ESC_QUOTE 8 + + +/* These three flags are internal use only. */ + +/* Character is a valid PrintableString character */ +#define CHARTYPE_PRINTABLESTRING 0x10 +/* Character needs escaping if it is the first character */ +#define CHARTYPE_FIRST_ESC_2253 0x20 +/* Character needs escaping if it is the last character */ +#define CHARTYPE_LAST_ESC_2253 0x40 + +/* NB the internal flags are safely reused below by flags + * handled at the top level. + */ + +/* If this is set we convert all character strings + * to UTF8 first + */ + +#define ASN1_STRFLGS_UTF8_CONVERT 0x10 + +/* If this is set we don't attempt to interpret content: + * just assume all strings are 1 byte per character. This + * will produce some pretty odd looking output! + */ + +#define ASN1_STRFLGS_IGNORE_TYPE 0x20 + +/* If this is set we include the string type in the output */ +#define ASN1_STRFLGS_SHOW_TYPE 0x40 + +/* This determines which strings to display and which to + * 'dump' (hex dump of content octets or DER encoding). We can + * only dump non character strings or everything. If we + * don't dump 'unknown' they are interpreted as character + * strings with 1 octet per character and are subject to + * the usual escaping options. + */ + +#define ASN1_STRFLGS_DUMP_ALL 0x80 +#define ASN1_STRFLGS_DUMP_UNKNOWN 0x100 + +/* These determine what 'dumping' does, we can dump the + * content octets or the DER encoding: both use the + * RFC2253 #XXXXX notation. + */ + +#define ASN1_STRFLGS_DUMP_DER 0x200 + +/* All the string flags consistent with RFC2253, + * escaping control characters isn't essential in + * RFC2253 but it is advisable anyway. + */ + +#define ASN1_STRFLGS_RFC2253 (ASN1_STRFLGS_ESC_2253 | \ + ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + ASN1_STRFLGS_UTF8_CONVERT | \ + ASN1_STRFLGS_DUMP_UNKNOWN | \ + ASN1_STRFLGS_DUMP_DER) + +DECLARE_STACK_OF(ASN1_INTEGER) +DECLARE_ASN1_SET_OF(ASN1_INTEGER) + +DECLARE_STACK_OF(ASN1_GENERALSTRING) + +typedef struct asn1_type_st + { + int type; + union { + char *ptr; + ASN1_BOOLEAN boolean; + ASN1_STRING * asn1_string; + ASN1_OBJECT * object; + ASN1_INTEGER * integer; + ASN1_ENUMERATED * enumerated; + ASN1_BIT_STRING * bit_string; + ASN1_OCTET_STRING * octet_string; + ASN1_PRINTABLESTRING * printablestring; + ASN1_T61STRING * t61string; + ASN1_IA5STRING * ia5string; + ASN1_GENERALSTRING * generalstring; + ASN1_BMPSTRING * bmpstring; + ASN1_UNIVERSALSTRING * universalstring; + ASN1_UTCTIME * utctime; + ASN1_GENERALIZEDTIME * generalizedtime; + ASN1_VISIBLESTRING * visiblestring; + ASN1_UTF8STRING * utf8string; + /* set and sequence are left complete and still + * contain the set or sequence bytes */ + ASN1_STRING * set; + ASN1_STRING * sequence; + } value; + } ASN1_TYPE; + +DECLARE_STACK_OF(ASN1_TYPE) +DECLARE_ASN1_SET_OF(ASN1_TYPE) + +typedef struct asn1_method_st + { + i2d_of_void *i2d; + d2i_of_void *d2i; + void *(*create)(void); + void (*destroy)(void *); + } ASN1_METHOD; + +/* This is used when parsing some Netscape objects */ +typedef struct asn1_header_st + { + ASN1_OCTET_STRING *header; + void *data; + ASN1_METHOD *meth; + } ASN1_HEADER; + +/* This is used to contain a list of bit names */ +typedef struct BIT_STRING_BITNAME_st { + int bitnum; + const char *lname; + const char *sname; +} BIT_STRING_BITNAME; + + +#define M_ASN1_STRING_length(x) ((x)->length) +#define M_ASN1_STRING_length_set(x, n) ((x)->length = (n)) +#define M_ASN1_STRING_type(x) ((x)->type) +#define M_ASN1_STRING_data(x) ((x)->data) + +/* Macros for string operations */ +#define M_ASN1_BIT_STRING_new() (ASN1_BIT_STRING *)\ + ASN1_STRING_type_new(V_ASN1_BIT_STRING) +#define M_ASN1_BIT_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_BIT_STRING_dup(a) (ASN1_BIT_STRING *)\ + ASN1_STRING_dup((ASN1_STRING *)a) +#define M_ASN1_BIT_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (ASN1_STRING *)a,(ASN1_STRING *)b) +#define M_ASN1_BIT_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) + +#define M_ASN1_INTEGER_new() (ASN1_INTEGER *)\ + ASN1_STRING_type_new(V_ASN1_INTEGER) +#define M_ASN1_INTEGER_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_INTEGER_dup(a) (ASN1_INTEGER *)ASN1_STRING_dup((ASN1_STRING *)a) +#define M_ASN1_INTEGER_cmp(a,b) ASN1_STRING_cmp(\ + (ASN1_STRING *)a,(ASN1_STRING *)b) + +#define M_ASN1_ENUMERATED_new() (ASN1_ENUMERATED *)\ + ASN1_STRING_type_new(V_ASN1_ENUMERATED) +#define M_ASN1_ENUMERATED_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_ENUMERATED_dup(a) (ASN1_ENUMERATED *)ASN1_STRING_dup((ASN1_STRING *)a) +#define M_ASN1_ENUMERATED_cmp(a,b) ASN1_STRING_cmp(\ + (ASN1_STRING *)a,(ASN1_STRING *)b) + +#define M_ASN1_OCTET_STRING_new() (ASN1_OCTET_STRING *)\ + ASN1_STRING_type_new(V_ASN1_OCTET_STRING) +#define M_ASN1_OCTET_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_OCTET_STRING_dup(a) (ASN1_OCTET_STRING *)\ + ASN1_STRING_dup((ASN1_STRING *)a) +#define M_ASN1_OCTET_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (ASN1_STRING *)a,(ASN1_STRING *)b) +#define M_ASN1_OCTET_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) +#define M_ASN1_OCTET_STRING_print(a,b) ASN1_STRING_print(a,(ASN1_STRING *)b) +#define M_i2d_ASN1_OCTET_STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_OCTET_STRING,\ + V_ASN1_UNIVERSAL) + +#define B_ASN1_TIME \ + B_ASN1_UTCTIME | \ + B_ASN1_GENERALIZEDTIME + +#define B_ASN1_PRINTABLE \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_T61STRING| \ + B_ASN1_IA5STRING| \ + B_ASN1_BIT_STRING| \ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING|\ + B_ASN1_SEQUENCE|\ + B_ASN1_UNKNOWN + +#define B_ASN1_DIRECTORYSTRING \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_TELETEXSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_UTF8STRING + +#define B_ASN1_DISPLAYTEXT \ + B_ASN1_IA5STRING| \ + B_ASN1_VISIBLESTRING| \ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING + +#define M_ASN1_PRINTABLE_new() ASN1_STRING_type_new(V_ASN1_T61STRING) +#define M_ASN1_PRINTABLE_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_PRINTABLE(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_PRINTABLE(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_PRINTABLE) + +#define M_DIRECTORYSTRING_new() ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +#define M_DIRECTORYSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_DIRECTORYSTRING(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +#define M_d2i_DIRECTORYSTRING(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DIRECTORYSTRING) + +#define M_DISPLAYTEXT_new() ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +#define M_DISPLAYTEXT_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_DISPLAYTEXT(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +#define M_d2i_DISPLAYTEXT(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DISPLAYTEXT) + +#define M_ASN1_PRINTABLESTRING_new() (ASN1_PRINTABLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +#define M_ASN1_PRINTABLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_PRINTABLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_PRINTABLESTRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_PRINTABLESTRING(a,pp,l) \ + (ASN1_PRINTABLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_PRINTABLESTRING) + +#define M_ASN1_T61STRING_new() (ASN1_T61STRING *)\ + ASN1_STRING_type_new(V_ASN1_T61STRING) +#define M_ASN1_T61STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_T61STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_T61STRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_T61STRING(a,pp,l) \ + (ASN1_T61STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_T61STRING) + +#define M_ASN1_IA5STRING_new() (ASN1_IA5STRING *)\ + ASN1_STRING_type_new(V_ASN1_IA5STRING) +#define M_ASN1_IA5STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_IA5STRING_dup(a) \ + (ASN1_IA5STRING *)ASN1_STRING_dup((ASN1_STRING *)a) +#define M_i2d_ASN1_IA5STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_IA5STRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_IA5STRING(a,pp,l) \ + (ASN1_IA5STRING *)d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l,\ + B_ASN1_IA5STRING) + +#define M_ASN1_UTCTIME_new() (ASN1_UTCTIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +#define M_ASN1_UTCTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_UTCTIME_dup(a) (ASN1_UTCTIME *)ASN1_STRING_dup((ASN1_STRING *)a) + +#define M_ASN1_GENERALIZEDTIME_new() (ASN1_GENERALIZEDTIME *)\ + ASN1_STRING_type_new(V_ASN1_GENERALIZEDTIME) +#define M_ASN1_GENERALIZEDTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_GENERALIZEDTIME_dup(a) (ASN1_GENERALIZEDTIME *)ASN1_STRING_dup(\ + (ASN1_STRING *)a) + +#define M_ASN1_TIME_new() (ASN1_TIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +#define M_ASN1_TIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_TIME_dup(a) (ASN1_TIME *)ASN1_STRING_dup((ASN1_STRING *)a) + +#define M_ASN1_GENERALSTRING_new() (ASN1_GENERALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_GENERALSTRING) +#define M_ASN1_GENERALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_GENERALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_GENERALSTRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_GENERALSTRING(a,pp,l) \ + (ASN1_GENERALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_GENERALSTRING) + +#define M_ASN1_UNIVERSALSTRING_new() (ASN1_UNIVERSALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_UNIVERSALSTRING) +#define M_ASN1_UNIVERSALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_UNIVERSALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UNIVERSALSTRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_UNIVERSALSTRING(a,pp,l) \ + (ASN1_UNIVERSALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UNIVERSALSTRING) + +#define M_ASN1_BMPSTRING_new() (ASN1_BMPSTRING *)\ + ASN1_STRING_type_new(V_ASN1_BMPSTRING) +#define M_ASN1_BMPSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_BMPSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_BMPSTRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_BMPSTRING(a,pp,l) \ + (ASN1_BMPSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_BMPSTRING) + +#define M_ASN1_VISIBLESTRING_new() (ASN1_VISIBLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +#define M_ASN1_VISIBLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_VISIBLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_VISIBLESTRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_VISIBLESTRING(a,pp,l) \ + (ASN1_VISIBLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_VISIBLESTRING) + +#define M_ASN1_UTF8STRING_new() (ASN1_UTF8STRING *)\ + ASN1_STRING_type_new(V_ASN1_UTF8STRING) +#define M_ASN1_UTF8STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_UTF8STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UTF8STRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_UTF8STRING(a,pp,l) \ + (ASN1_UTF8STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UTF8STRING) + + /* for the is_set parameter to i2d_ASN1_SET */ +#define IS_SEQUENCE 0 +#define IS_SET 1 + +DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, ASN1_ANY, ASN1_TYPE) + +int ASN1_TYPE_get(ASN1_TYPE *a); +void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); + +ASN1_OBJECT * ASN1_OBJECT_new(void ); +void ASN1_OBJECT_free(ASN1_OBJECT *a); +int i2d_ASN1_OBJECT(ASN1_OBJECT *a,unsigned char **pp); +ASN1_OBJECT * c2i_ASN1_OBJECT(ASN1_OBJECT **a,const unsigned char **pp, + long length); +ASN1_OBJECT * d2i_ASN1_OBJECT(ASN1_OBJECT **a,const unsigned char **pp, + long length); + +DECLARE_ASN1_ITEM(ASN1_OBJECT) + +DECLARE_STACK_OF(ASN1_OBJECT) +DECLARE_ASN1_SET_OF(ASN1_OBJECT) + +ASN1_STRING * ASN1_STRING_new(void); +void ASN1_STRING_free(ASN1_STRING *a); +ASN1_STRING * ASN1_STRING_dup(ASN1_STRING *a); +ASN1_STRING * ASN1_STRING_type_new(int type ); +int ASN1_STRING_cmp(ASN1_STRING *a, ASN1_STRING *b); + /* Since this is used to store all sorts of things, via macros, for now, make + its data void * */ +int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); +int ASN1_STRING_length(ASN1_STRING *x); +void ASN1_STRING_length_set(ASN1_STRING *x, int n); +int ASN1_STRING_type(ASN1_STRING *x); +unsigned char * ASN1_STRING_data(ASN1_STRING *x); + +DECLARE_ASN1_FUNCTIONS(ASN1_BIT_STRING) +int i2c_ASN1_BIT_STRING(ASN1_BIT_STRING *a,unsigned char **pp); +ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a,const unsigned char **pp, + long length); +int ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d, + int length ); +int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value); +int ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *a, int n); + +#ifndef OPENSSL_NO_BIO +int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, + BIT_STRING_BITNAME *tbl, int indent); +#endif +int ASN1_BIT_STRING_num_asc(char *name, BIT_STRING_BITNAME *tbl); +int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, char *name, int value, + BIT_STRING_BITNAME *tbl); + +int i2d_ASN1_BOOLEAN(int a,unsigned char **pp); +int d2i_ASN1_BOOLEAN(int *a,const unsigned char **pp,long length); + +DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) +int i2c_ASN1_INTEGER(ASN1_INTEGER *a,unsigned char **pp); +ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a,const unsigned char **pp, + long length); +ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a,const unsigned char **pp, + long length); +ASN1_INTEGER * ASN1_INTEGER_dup(ASN1_INTEGER *x); +int ASN1_INTEGER_cmp(ASN1_INTEGER *x, ASN1_INTEGER *y); + +DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED) + +int ASN1_UTCTIME_check(ASN1_UTCTIME *a); +ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s,time_t t); +int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str); +int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); +#if 0 +time_t ASN1_UTCTIME_get(const ASN1_UTCTIME *s); +#endif + +int ASN1_GENERALIZEDTIME_check(ASN1_GENERALIZEDTIME *a); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s,time_t t); +int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str); + +DECLARE_ASN1_FUNCTIONS(ASN1_OCTET_STRING) +ASN1_OCTET_STRING * ASN1_OCTET_STRING_dup(ASN1_OCTET_STRING *a); +int ASN1_OCTET_STRING_cmp(ASN1_OCTET_STRING *a, ASN1_OCTET_STRING *b); +int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, int len); + +DECLARE_ASN1_FUNCTIONS(ASN1_VISIBLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UNIVERSALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTF8STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_NULL) +DECLARE_ASN1_FUNCTIONS(ASN1_BMPSTRING) + +int UTF8_getc(const unsigned char *str, int len, unsigned long *val); +int UTF8_putc(unsigned char *str, int len, unsigned long value); + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, ASN1_PRINTABLE) + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DIRECTORYSTRING) +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DISPLAYTEXT) +DECLARE_ASN1_FUNCTIONS(ASN1_PRINTABLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_T61STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_IA5STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALIZEDTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_TIME) + +DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF) + +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s,time_t t); +int ASN1_TIME_check(ASN1_TIME *t); +ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out); + +int i2d_ASN1_SET(STACK *a, unsigned char **pp, + i2d_of_void *i2d, int ex_tag, int ex_class, int is_set); +STACK * d2i_ASN1_SET(STACK **a, const unsigned char **pp, long length, + d2i_of_void *d2i, void (*free_func)(void *), + int ex_tag, int ex_class); + +#ifndef OPENSSL_NO_BIO +int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a); +int a2i_ASN1_INTEGER(BIO *bp,ASN1_INTEGER *bs,char *buf,int size); +int i2a_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *a); +int a2i_ASN1_ENUMERATED(BIO *bp,ASN1_ENUMERATED *bs,char *buf,int size); +int i2a_ASN1_OBJECT(BIO *bp,ASN1_OBJECT *a); +int a2i_ASN1_STRING(BIO *bp,ASN1_STRING *bs,char *buf,int size); +int i2a_ASN1_STRING(BIO *bp, ASN1_STRING *a, int type); +#endif +int i2t_ASN1_OBJECT(char *buf,int buf_len,ASN1_OBJECT *a); + +int a2d_ASN1_OBJECT(unsigned char *out,int olen, const char *buf, int num); +ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data,int len, + const char *sn, const char *ln); + +int ASN1_INTEGER_set(ASN1_INTEGER *a, long v); +long ASN1_INTEGER_get(ASN1_INTEGER *a); +ASN1_INTEGER *BN_to_ASN1_INTEGER(BIGNUM *bn, ASN1_INTEGER *ai); +BIGNUM *ASN1_INTEGER_to_BN(ASN1_INTEGER *ai,BIGNUM *bn); + +int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); +long ASN1_ENUMERATED_get(ASN1_ENUMERATED *a); +ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(BIGNUM *bn, ASN1_ENUMERATED *ai); +BIGNUM *ASN1_ENUMERATED_to_BN(ASN1_ENUMERATED *ai,BIGNUM *bn); + +/* General */ +/* given a string, return the correct type, max is the maximum length */ +int ASN1_PRINTABLE_type(const unsigned char *s, int max); + +int i2d_ASN1_bytes(ASN1_STRING *a, unsigned char **pp, int tag, int xclass); +ASN1_STRING *d2i_ASN1_bytes(ASN1_STRING **a, const unsigned char **pp, + long length, int Ptag, int Pclass); +unsigned long ASN1_tag2bit(int tag); +/* type is one or more of the B_ASN1_ values. */ +ASN1_STRING *d2i_ASN1_type_bytes(ASN1_STRING **a,const unsigned char **pp, + long length,int type); + +/* PARSING */ +int asn1_Finish(ASN1_CTX *c); +int asn1_const_Finish(ASN1_const_CTX *c); + +/* SPECIALS */ +int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, + int *pclass, long omax); +int ASN1_check_infinite_end(unsigned char **p,long len); +int ASN1_const_check_infinite_end(const unsigned char **p,long len); +void ASN1_put_object(unsigned char **pp, int constructed, int length, + int tag, int xclass); +int ASN1_put_eoc(unsigned char **pp); +int ASN1_object_size(int constructed, int length, int tag); + +/* Used to implement other functions */ +void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, char *x); + +#define ASN1_dup_of(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(type, x))) + +#define ASN1_dup_of_const(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(const type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(const type, x))) + +void *ASN1_item_dup(const ASN1_ITEM *it, void *x); + +#ifndef OPENSSL_NO_FP_API +void *ASN1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x); + +#define ASN1_d2i_fp_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); +int ASN1_i2d_fp(i2d_of_void *i2d,FILE *out,void *x); + +#define ASN1_i2d_fp_of(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +#define ASN1_i2d_fp_of_const(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x); +int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, unsigned long flags); +#endif + +int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in); + +#ifndef OPENSSL_NO_BIO +void *ASN1_d2i_bio(void *(*xnew)(void), d2i_of_void *d2i, BIO *in, void **x); + +#define ASN1_d2i_bio_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_bio( CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x); +int ASN1_i2d_bio(i2d_of_void *i2d,BIO *out, unsigned char *x); + +#define ASN1_i2d_bio_of(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +#define ASN1_i2d_bio_of_const(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x); +int ASN1_UTCTIME_print(BIO *fp,ASN1_UTCTIME *a); +int ASN1_GENERALIZEDTIME_print(BIO *fp,ASN1_GENERALIZEDTIME *a); +int ASN1_TIME_print(BIO *fp,ASN1_TIME *a); +int ASN1_STRING_print(BIO *bp,ASN1_STRING *v); +int ASN1_STRING_print_ex(BIO *out, ASN1_STRING *str, unsigned long flags); +int ASN1_parse(BIO *bp,const unsigned char *pp,long len,int indent); +int ASN1_parse_dump(BIO *bp,const unsigned char *pp,long len,int indent,int dump); +#endif +const char *ASN1_tag2str(int tag); + +/* Used to load and write netscape format cert/key */ +int i2d_ASN1_HEADER(ASN1_HEADER *a,unsigned char **pp); +ASN1_HEADER *d2i_ASN1_HEADER(ASN1_HEADER **a,const unsigned char **pp, long length); +ASN1_HEADER *ASN1_HEADER_new(void ); +void ASN1_HEADER_free(ASN1_HEADER *a); + +int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s); + +/* Not used that much at this point, except for the first two */ +ASN1_METHOD *X509_asn1_meth(void); +ASN1_METHOD *RSAPrivateKey_asn1_meth(void); +ASN1_METHOD *ASN1_IA5STRING_asn1_meth(void); +ASN1_METHOD *ASN1_BIT_STRING_asn1_meth(void); + +int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, + unsigned char *data, int len); +int ASN1_TYPE_get_octetstring(ASN1_TYPE *a, + unsigned char *data, int max_len); +int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, + unsigned char *data, int len); +int ASN1_TYPE_get_int_octetstring(ASN1_TYPE *a,long *num, + unsigned char *data, int max_len); + +STACK *ASN1_seq_unpack(const unsigned char *buf, int len, + d2i_of_void *d2i, void (*free_func)(void *)); +unsigned char *ASN1_seq_pack(STACK *safes, i2d_of_void *i2d, + unsigned char **buf, int *len ); +void *ASN1_unpack_string(ASN1_STRING *oct, d2i_of_void *d2i); +void *ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it); +ASN1_STRING *ASN1_pack_string(void *obj, i2d_of_void *i2d, + ASN1_OCTET_STRING **oct); + +#define ASN1_pack_string_of(type,obj,i2d,oct) \ + (ASN1_pack_string(CHECKED_PTR_OF(type, obj), \ + CHECKED_I2D_OF(type, i2d), \ + oct)) + +ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_OCTET_STRING **oct); + +void ASN1_STRING_set_default_mask(unsigned long mask); +int ASN1_STRING_set_default_mask_asc(char *p); +unsigned long ASN1_STRING_get_default_mask(void); +int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask); +int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask, + long minsize, long maxsize); + +ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, + const unsigned char *in, int inlen, int inform, int nid); +ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid); +int ASN1_STRING_TABLE_add(int, long, long, unsigned long, unsigned long); +void ASN1_STRING_TABLE_cleanup(void); + +/* ASN1 template functions */ + +/* Old API compatible functions */ +ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); +void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); +ASN1_VALUE * ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, long len, const ASN1_ITEM *it); +int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); +int ASN1_item_ndef_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); + +void ASN1_add_oid_module(void); + +ASN1_TYPE *ASN1_generate_nconf(char *str, CONF *nconf); +ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ASN1_strings(void); + +/* Error codes for the ASN1 functions. */ + +/* Function codes. */ +#define ASN1_F_A2D_ASN1_OBJECT 100 +#define ASN1_F_A2I_ASN1_ENUMERATED 101 +#define ASN1_F_A2I_ASN1_INTEGER 102 +#define ASN1_F_A2I_ASN1_STRING 103 +#define ASN1_F_APPEND_EXP 176 +#define ASN1_F_ASN1_BIT_STRING_SET_BIT 183 +#define ASN1_F_ASN1_CB 177 +#define ASN1_F_ASN1_CHECK_TLEN 104 +#define ASN1_F_ASN1_COLLATE_PRIMITIVE 105 +#define ASN1_F_ASN1_COLLECT 106 +#define ASN1_F_ASN1_D2I_EX_PRIMITIVE 108 +#define ASN1_F_ASN1_D2I_FP 109 +#define ASN1_F_ASN1_D2I_READ_BIO 107 +#define ASN1_F_ASN1_DIGEST 184 +#define ASN1_F_ASN1_DO_ADB 110 +#define ASN1_F_ASN1_DUP 111 +#define ASN1_F_ASN1_ENUMERATED_SET 112 +#define ASN1_F_ASN1_ENUMERATED_TO_BN 113 +#define ASN1_F_ASN1_EX_C2I 204 +#define ASN1_F_ASN1_FIND_END 190 +#define ASN1_F_ASN1_GENERALIZEDTIME_SET 185 +#define ASN1_F_ASN1_GENERATE_V3 178 +#define ASN1_F_ASN1_GET_OBJECT 114 +#define ASN1_F_ASN1_HEADER_NEW 115 +#define ASN1_F_ASN1_I2D_BIO 116 +#define ASN1_F_ASN1_I2D_FP 117 +#define ASN1_F_ASN1_INTEGER_SET 118 +#define ASN1_F_ASN1_INTEGER_TO_BN 119 +#define ASN1_F_ASN1_ITEM_D2I_FP 206 +#define ASN1_F_ASN1_ITEM_DUP 191 +#define ASN1_F_ASN1_ITEM_EX_COMBINE_NEW 121 +#define ASN1_F_ASN1_ITEM_EX_D2I 120 +#define ASN1_F_ASN1_ITEM_I2D_BIO 192 +#define ASN1_F_ASN1_ITEM_I2D_FP 193 +#define ASN1_F_ASN1_ITEM_PACK 198 +#define ASN1_F_ASN1_ITEM_SIGN 195 +#define ASN1_F_ASN1_ITEM_UNPACK 199 +#define ASN1_F_ASN1_ITEM_VERIFY 197 +#define ASN1_F_ASN1_MBSTRING_NCOPY 122 +#define ASN1_F_ASN1_OBJECT_NEW 123 +#define ASN1_F_ASN1_PACK_STRING 124 +#define ASN1_F_ASN1_PCTX_NEW 205 +#define ASN1_F_ASN1_PKCS5_PBE_SET 125 +#define ASN1_F_ASN1_SEQ_PACK 126 +#define ASN1_F_ASN1_SEQ_UNPACK 127 +#define ASN1_F_ASN1_SIGN 128 +#define ASN1_F_ASN1_STR2TYPE 179 +#define ASN1_F_ASN1_STRING_SET 186 +#define ASN1_F_ASN1_STRING_TABLE_ADD 129 +#define ASN1_F_ASN1_STRING_TYPE_NEW 130 +#define ASN1_F_ASN1_TEMPLATE_EX_D2I 132 +#define ASN1_F_ASN1_TEMPLATE_NEW 133 +#define ASN1_F_ASN1_TEMPLATE_NOEXP_D2I 131 +#define ASN1_F_ASN1_TIME_SET 175 +#define ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING 134 +#define ASN1_F_ASN1_TYPE_GET_OCTETSTRING 135 +#define ASN1_F_ASN1_UNPACK_STRING 136 +#define ASN1_F_ASN1_UTCTIME_SET 187 +#define ASN1_F_ASN1_VERIFY 137 +#define ASN1_F_BITSTR_CB 180 +#define ASN1_F_BN_TO_ASN1_ENUMERATED 138 +#define ASN1_F_BN_TO_ASN1_INTEGER 139 +#define ASN1_F_C2I_ASN1_BIT_STRING 189 +#define ASN1_F_C2I_ASN1_INTEGER 194 +#define ASN1_F_C2I_ASN1_OBJECT 196 +#define ASN1_F_COLLECT_DATA 140 +#define ASN1_F_D2I_ASN1_BIT_STRING 141 +#define ASN1_F_D2I_ASN1_BOOLEAN 142 +#define ASN1_F_D2I_ASN1_BYTES 143 +#define ASN1_F_D2I_ASN1_GENERALIZEDTIME 144 +#define ASN1_F_D2I_ASN1_HEADER 145 +#define ASN1_F_D2I_ASN1_INTEGER 146 +#define ASN1_F_D2I_ASN1_OBJECT 147 +#define ASN1_F_D2I_ASN1_SET 148 +#define ASN1_F_D2I_ASN1_TYPE_BYTES 149 +#define ASN1_F_D2I_ASN1_UINTEGER 150 +#define ASN1_F_D2I_ASN1_UTCTIME 151 +#define ASN1_F_D2I_NETSCAPE_RSA 152 +#define ASN1_F_D2I_NETSCAPE_RSA_2 153 +#define ASN1_F_D2I_PRIVATEKEY 154 +#define ASN1_F_D2I_PUBLICKEY 155 +#define ASN1_F_D2I_RSA_NET 200 +#define ASN1_F_D2I_RSA_NET_2 201 +#define ASN1_F_D2I_X509 156 +#define ASN1_F_D2I_X509_CINF 157 +#define ASN1_F_D2I_X509_PKEY 159 +#define ASN1_F_I2D_ASN1_SET 188 +#define ASN1_F_I2D_ASN1_TIME 160 +#define ASN1_F_I2D_DSA_PUBKEY 161 +#define ASN1_F_I2D_EC_PUBKEY 181 +#define ASN1_F_I2D_PRIVATEKEY 163 +#define ASN1_F_I2D_PUBLICKEY 164 +#define ASN1_F_I2D_RSA_NET 162 +#define ASN1_F_I2D_RSA_PUBKEY 165 +#define ASN1_F_LONG_C2I 166 +#define ASN1_F_OID_MODULE_INIT 174 +#define ASN1_F_PARSE_TAGGING 182 +#define ASN1_F_PKCS5_PBE2_SET 167 +#define ASN1_F_PKCS5_PBE_SET 202 +#define ASN1_F_X509_CINF_NEW 168 +#define ASN1_F_X509_CRL_ADD0_REVOKED 169 +#define ASN1_F_X509_INFO_NEW 170 +#define ASN1_F_X509_NAME_ENCODE 203 +#define ASN1_F_X509_NAME_EX_D2I 158 +#define ASN1_F_X509_NAME_EX_NEW 171 +#define ASN1_F_X509_NEW 172 +#define ASN1_F_X509_PKEY_NEW 173 + +/* Reason codes. */ +#define ASN1_R_ADDING_OBJECT 171 +#define ASN1_R_AUX_ERROR 100 +#define ASN1_R_BAD_CLASS 101 +#define ASN1_R_BAD_OBJECT_HEADER 102 +#define ASN1_R_BAD_PASSWORD_READ 103 +#define ASN1_R_BAD_TAG 104 +#define ASN1_R_BN_LIB 105 +#define ASN1_R_BOOLEAN_IS_WRONG_LENGTH 106 +#define ASN1_R_BUFFER_TOO_SMALL 107 +#define ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 108 +#define ASN1_R_DATA_IS_WRONG 109 +#define ASN1_R_DECODE_ERROR 110 +#define ASN1_R_DECODING_ERROR 111 +#define ASN1_R_DEPTH_EXCEEDED 174 +#define ASN1_R_ENCODE_ERROR 112 +#define ASN1_R_ERROR_GETTING_TIME 173 +#define ASN1_R_ERROR_LOADING_SECTION 172 +#define ASN1_R_ERROR_PARSING_SET_ELEMENT 113 +#define ASN1_R_ERROR_SETTING_CIPHER_PARAMS 114 +#define ASN1_R_EXPECTING_AN_INTEGER 115 +#define ASN1_R_EXPECTING_AN_OBJECT 116 +#define ASN1_R_EXPECTING_A_BOOLEAN 117 +#define ASN1_R_EXPECTING_A_TIME 118 +#define ASN1_R_EXPLICIT_LENGTH_MISMATCH 119 +#define ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED 120 +#define ASN1_R_FIELD_MISSING 121 +#define ASN1_R_FIRST_NUM_TOO_LARGE 122 +#define ASN1_R_HEADER_TOO_LONG 123 +#define ASN1_R_ILLEGAL_BITSTRING_FORMAT 175 +#define ASN1_R_ILLEGAL_BOOLEAN 176 +#define ASN1_R_ILLEGAL_CHARACTERS 124 +#define ASN1_R_ILLEGAL_FORMAT 177 +#define ASN1_R_ILLEGAL_HEX 178 +#define ASN1_R_ILLEGAL_IMPLICIT_TAG 179 +#define ASN1_R_ILLEGAL_INTEGER 180 +#define ASN1_R_ILLEGAL_NESTED_TAGGING 181 +#define ASN1_R_ILLEGAL_NULL 125 +#define ASN1_R_ILLEGAL_NULL_VALUE 182 +#define ASN1_R_ILLEGAL_OBJECT 183 +#define ASN1_R_ILLEGAL_OPTIONAL_ANY 126 +#define ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE 170 +#define ASN1_R_ILLEGAL_TAGGED_ANY 127 +#define ASN1_R_ILLEGAL_TIME_VALUE 184 +#define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 +#define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 +#define ASN1_R_INVALID_BMPSTRING_LENGTH 129 +#define ASN1_R_INVALID_DIGIT 130 +#define ASN1_R_INVALID_MODIFIER 186 +#define ASN1_R_INVALID_NUMBER 187 +#define ASN1_R_INVALID_SEPARATOR 131 +#define ASN1_R_INVALID_TIME_FORMAT 132 +#define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH 133 +#define ASN1_R_INVALID_UTF8STRING 134 +#define ASN1_R_IV_TOO_LARGE 135 +#define ASN1_R_LENGTH_ERROR 136 +#define ASN1_R_LIST_ERROR 188 +#define ASN1_R_MISSING_EOC 137 +#define ASN1_R_MISSING_SECOND_NUMBER 138 +#define ASN1_R_MISSING_VALUE 189 +#define ASN1_R_MSTRING_NOT_UNIVERSAL 139 +#define ASN1_R_MSTRING_WRONG_TAG 140 +#define ASN1_R_NESTED_ASN1_STRING 197 +#define ASN1_R_NON_HEX_CHARACTERS 141 +#define ASN1_R_NOT_ASCII_FORMAT 190 +#define ASN1_R_NOT_ENOUGH_DATA 142 +#define ASN1_R_NO_MATCHING_CHOICE_TYPE 143 +#define ASN1_R_NULL_IS_WRONG_LENGTH 144 +#define ASN1_R_OBJECT_NOT_ASCII_FORMAT 191 +#define ASN1_R_ODD_NUMBER_OF_CHARS 145 +#define ASN1_R_PRIVATE_KEY_HEADER_MISSING 146 +#define ASN1_R_SECOND_NUMBER_TOO_LARGE 147 +#define ASN1_R_SEQUENCE_LENGTH_MISMATCH 148 +#define ASN1_R_SEQUENCE_NOT_CONSTRUCTED 149 +#define ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG 192 +#define ASN1_R_SHORT_LINE 150 +#define ASN1_R_STRING_TOO_LONG 151 +#define ASN1_R_STRING_TOO_SHORT 152 +#define ASN1_R_TAG_VALUE_TOO_HIGH 153 +#define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 154 +#define ASN1_R_TIME_NOT_ASCII_FORMAT 193 +#define ASN1_R_TOO_LONG 155 +#define ASN1_R_TYPE_NOT_CONSTRUCTED 156 +#define ASN1_R_UNABLE_TO_DECODE_RSA_KEY 157 +#define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY 158 +#define ASN1_R_UNEXPECTED_EOC 159 +#define ASN1_R_UNKNOWN_FORMAT 160 +#define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM 161 +#define ASN1_R_UNKNOWN_OBJECT_TYPE 162 +#define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE 163 +#define ASN1_R_UNKNOWN_TAG 194 +#define ASN1_R_UNKOWN_FORMAT 195 +#define ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE 164 +#define ASN1_R_UNSUPPORTED_CIPHER 165 +#define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM 166 +#define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE 167 +#define ASN1_R_UNSUPPORTED_TYPE 196 +#define ASN1_R_WRONG_TAG 168 +#define ASN1_R_WRONG_TYPE 169 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/asn1_mac.h b/mswin32/OpenSSL/include/openssl/asn1_mac.h new file mode 100755 index 000000000..d958ca60d --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/asn1_mac.h @@ -0,0 +1,571 @@ +/* crypto/asn1/asn1_mac.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.] + */ + +#ifndef HEADER_ASN1_MAC_H +#define HEADER_ASN1_MAC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#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),__FILE__,(line)) + +#define M_ASN1_D2I_vars(a,type,func) \ + ASN1_const_CTX c; \ + type ret=NULL; \ + \ + c.pp=(const unsigned char **)pp; \ + c.q= *(const unsigned char **)pp; \ + c.error=ERR_R_NESTED_ASN1_ERROR; \ + if ((a == NULL) || ((*a) == NULL)) \ + { if ((ret=(type)func()) == NULL) \ + { c.line=__LINE__; goto err; } } \ + else ret=(*a); + +#define M_ASN1_D2I_Init() \ + c.p= *(const unsigned char **)pp; \ + c.max=(length == 0)?0:(c.p+length); + +#define M_ASN1_D2I_Finish_2(a) \ + if (!asn1_const_Finish(&c)) \ + { c.line=__LINE__; goto err; } \ + *(const unsigned char **)pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); + +#define M_ASN1_D2I_Finish(a,func,e) \ + M_ASN1_D2I_Finish_2(a); \ +err:\ + ASN1_MAC_H_err((e),c.error,c.line); \ + asn1_add_error(*(const unsigned char **)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)) \ + { c.line=__LINE__; goto err; } +/* Begin reading ASN1 without a surrounding sequence */ +#define M_ASN1_D2I_begin() \ + c.slen = length; + +/* End reading ASN1 with no check on length */ +#define M_ASN1_D2I_Finish_nolen(a, func, e) \ + *pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); \ +err:\ + 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_end_sequence() \ + (((c.inf&1) == 0)?(c.slen <= 0): \ + (c.eos=ASN1_const_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) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +/* Don't use this with d2i_ASN1_BOOLEAN() */ +#define M_ASN1_D2I_get_x(type,b,func) \ + c.q=c.p; \ + if (((D2I_OF(type))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) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ + == (V_ASN1_UNIVERSAL|(type)))) \ + { \ + M_ASN1_D2I_get(b,func); \ + } + +#define M_ASN1_D2I_get_imp(b,func, type) \ + M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \ + c.slen-=(c.p-c.q);\ + M_ASN1_next_prev=_tmp; + +#define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \ + (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \ + { \ + unsigned char _tmp = M_ASN1_next; \ + M_ASN1_D2I_get_imp(b,func, type);\ + } + +#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_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,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_D2I_get_set_opt_type(type,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_type(type,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_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +#define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE_type(type,a,f); + +#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,free_func,\ + tag,V_ASN1_CONTEXT_SPECIFIC); \ + } + +#define M_ASN1_D2I_get_IMP_set_opt_type(type,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_type(type,b,func,free_func,\ + tag,V_ASN1_CONTEXT_SPECIFIC); \ + } + +#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_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +#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,free_func); } + +#define M_ASN1_D2I_get_seq_opt_type(type,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_type(type,r,func,free_func); } + +#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_type(type,r,func,free_func,x) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + x,V_ASN1_CONTEXT_SPECIFIC); + +#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,\ + (void (*)())free_func,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +#define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\ + 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) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +#define M_ASN1_D2I_get_EXP_opt(r,func,tag) \ + if ((c.slen != 0L) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (func(&(r),&c.p,Tlen) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +#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))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \ + (void (*)())free_func, \ + b,V_ASN1_UNIVERSAL) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +#define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \ + if ((c.slen != 0) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \ + free_func,b,V_ASN1_UNIVERSAL) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +/* New macros */ +#define M_ASN1_New_Malloc(ret,type) \ + if ((ret=(type *)OPENSSL_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: ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \ + return(NULL);*/ \ + err2: ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \ + return(NULL) + + +/* BIG UGLY WARNING! This is so damn ugly I wanna puke. Unfortunately, + some macros that use ASN1_const_CTX still insist on writing in the input + stream. ARGH! ARGH! ARGH! Let's get rid of this macro package. + Please? -- Richard Levitte */ +#define M_ASN1_next (*((unsigned char *)(c.p))) +#define M_ASN1_next_prev (*((unsigned char *)(c.q))) + +/*************************************************/ + +#define M_ASN1_I2D_vars(a) int r=0,ret=0; \ + unsigned char *p; \ + if (a == NULL) return(0) + +/* Length Macros */ +#define M_ASN1_I2D_len(a,f) ret+=f(a,NULL) +#define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f) + +#define M_ASN1_I2D_len_SET(a,f) \ + ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET); + +#define M_ASN1_I2D_len_SET_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \ + V_ASN1_UNIVERSAL,IS_SET); + +#define M_ASN1_I2D_len_SEQUENCE(a,f) \ + ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); + +#define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \ + V_ASN1_UNIVERSAL,IS_SEQUENCE) + +#define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE(a,f); + +#define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE_type(type,a,f); + +#define M_ASN1_I2D_len_IMP_SET(a,f,x) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +#define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +#define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); + +#define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +#define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +#define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +#define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +#define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \ + if (a != NULL)\ + { \ + v=f(a,NULL); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +#define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0))\ + { \ + v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +#define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0))\ + { \ + v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +#define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0))\ + { \ + v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \ + V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +/* Put Macros */ +#define M_ASN1_I2D_put(a,f) f(a,&p) + +#define M_ASN1_I2D_put_IMP_opt(a,f,t) \ + if (a != NULL) \ + { \ + unsigned char *q=p; \ + f(a,&p); \ + *q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\ + } + +#define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\ + V_ASN1_UNIVERSAL,IS_SET) +#define M_ASN1_I2D_put_SET_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET) +#define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ + V_ASN1_CONTEXT_SPECIFIC,IS_SET) +#define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \ + i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET) +#define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ + V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE) + +#define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\ + V_ASN1_UNIVERSAL,IS_SEQUENCE) + +#define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE) + +#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +#define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); } + +#define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); } + +#define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); } + +#define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); } + +#define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \ + if (a != NULL) \ + { \ + ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \ + f(a,&p); \ + } + +#define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ + } + +#define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \ + } + +#define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + } + +#define M_ASN1_I2D_seq_total() \ + r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \ + if (pp == NULL) return(r); \ + p= *pp; \ + ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +#define M_ASN1_I2D_INF_seq_start(tag,ctx) \ + *(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \ + *(p++)=0x80 + +#define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00 + +#define M_ASN1_I2D_finish() *pp=p; \ + return(r); + +int asn1_GetSequence(ASN1_const_CTX *c, long *length); +void asn1_add_error(const unsigned char *address,int offset); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/asn1t.h b/mswin32/OpenSSL/include/openssl/asn1t.h new file mode 100755 index 000000000..adbc2a63d --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/asn1t.h @@ -0,0 +1,886 @@ +/* asn1t.h */ +/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL + * project 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ASN1T_H +#define HEADER_ASN1T_H + +#include +#include +#include + +#ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +#endif + +/* ASN1 template defines, structures and functions */ + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +#define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr)) + + +/* Macros for start and end of ASN1_ITEM definition */ + +#define ASN1_ITEM_start(itname) \ + OPENSSL_GLOBAL const ASN1_ITEM itname##_it = { + +#define ASN1_ITEM_end(itname) \ + }; + +#else + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +#define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr())) + + +/* Macros for start and end of ASN1_ITEM definition */ + +#define ASN1_ITEM_start(itname) \ + const ASN1_ITEM * itname##_it(void) \ + { \ + static const ASN1_ITEM local_it = { + +#define ASN1_ITEM_end(itname) \ + }; \ + return &local_it; \ + } + +#endif + + +/* Macros to aid ASN1 template writing */ + +#define ASN1_ITEM_TEMPLATE(tname) \ + static const ASN1_TEMPLATE tname##_item_tt + +#define ASN1_ITEM_TEMPLATE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE,\ + -1,\ + &tname##_item_tt,\ + 0,\ + NULL,\ + 0,\ + #tname \ + ASN1_ITEM_end(tname) + + +/* This is a ASN1 type which just embeds a template */ + +/* This pair helps declare a SEQUENCE. We can do: + * + * ASN1_SEQUENCE(stname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END(stname) + * + * This will produce an ASN1_ITEM called stname_it + * for a structure called stname. + * + * If you want the same structure but a different + * name then use: + * + * ASN1_SEQUENCE(itname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END_name(stname, itname) + * + * This will create an item called itname_it using + * a structure called stname. + */ + +#define ASN1_SEQUENCE(tname) \ + static const ASN1_TEMPLATE tname##_seq_tt[] + +#define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) + +#define ASN1_SEQUENCE_END_name(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +#define ASN1_NDEF_SEQUENCE(tname) \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_SEQUENCE(tname) + +#define ASN1_BROKEN_SEQUENCE(tname) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_ref(tname, cb, lck) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_enc(tname, enc, cb) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \ + ASN1_SEQUENCE(tname) + +#define ASN1_NDEF_SEQUENCE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(tname),\ + #tname \ + ASN1_ITEM_end(tname) + +#define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname) + +#define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +#define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +#define ASN1_SEQUENCE_END_ref(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + + +/* This pair helps declare a CHOICE type. We can do: + * + * ASN1_CHOICE(chname) = { + * ... CHOICE options ... + * ASN1_CHOICE_END(chname) + * + * This will produce an ASN1_ITEM called chname_it + * for a structure called chname. The structure + * definition must look like this: + * typedef struct { + * int type; + * union { + * ASN1_SOMETHING *opt1; + * ASN1_SOMEOTHER *opt2; + * } value; + * } chname; + * + * the name of the selector must be 'type'. + * to use an alternative selector name use the + * ASN1_CHOICE_END_selector() version. + */ + +#define ASN1_CHOICE(tname) \ + static const ASN1_TEMPLATE tname##_ch_tt[] + +#define ASN1_CHOICE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_CHOICE(tname) + +#define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) + +#define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) + +#define ASN1_CHOICE_END_selector(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +#define ASN1_CHOICE_END_cb(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/* This helps with the template wrapper form of ASN1_ITEM */ + +#define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ + (flags), (tag), 0,\ + #name, ASN1_ITEM_ref(type) } + +/* These help with SEQUENCE or CHOICE components */ + +/* used to declare other types */ + +#define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ + (flags), (tag), offsetof(stname, field),\ + #field, ASN1_ITEM_ref(type) } + +/* used when the structure is combined with the parent */ + +#define ASN1_EX_COMBINE(flags, tag, type) { \ + (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) } + +/* implicit and explicit helper macros */ + +#define ASN1_IMP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type) + +#define ASN1_EXP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type) + +/* Any defined by macros: the field used is in the table itself */ + +#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION +#define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +#else +#define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb } +#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb } +#endif +/* Plain simple type */ +#define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type) + +/* OPTIONAL simple type */ +#define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* IMPLICIT tagged simple type */ +#define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) + +/* IMPLICIT tagged OPTIONAL simple type */ +#define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* Same as above but EXPLICIT */ + +#define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) +#define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* SEQUENCE OF type */ +#define ASN1_SEQUENCE_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) + +/* OPTIONAL SEQUENCE OF */ +#define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Same as above but for SET OF */ + +#define ASN1_SET_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) + +#define ASN1_SET_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ + +#define ASN1_IMP_SET_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +#define ASN1_EXP_SET_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +#define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +#define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +#define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +#define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +#define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +#define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +/* EXPLICIT OPTIONAL using indefinite length constructed form */ +#define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF) + +/* Macros for the ASN1_ADB structure */ + +#define ASN1_ADB(name) \ + static const ASN1_ADB_TABLE name##_adbtbl[] + +#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION + +#define ASN1_ADB_END(name, flags, field, app_table, def, none) \ + ;\ + static const ASN1_ADB name##_adb = {\ + flags,\ + offsetof(name, field),\ + app_table,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + } + +#else + +#define ASN1_ADB_END(name, flags, field, app_table, def, none) \ + ;\ + static const ASN1_ITEM *name##_adb(void) \ + { \ + static const ASN1_ADB internal_adb = \ + {\ + flags,\ + offsetof(name, field),\ + app_table,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + }; \ + return (const ASN1_ITEM *) &internal_adb; \ + } \ + void dummy_function(void) + +#endif + +#define ADB_ENTRY(val, template) {val, template} + +#define ASN1_ADB_TEMPLATE(name) \ + static const ASN1_TEMPLATE name##_tt + +/* This is the ASN1 template structure that defines + * a wrapper round the actual type. It determines the + * actual position of the field in the value structure, + * various flags such as OPTIONAL and the field name. + */ + +struct ASN1_TEMPLATE_st { +unsigned long flags; /* Various flags */ +long tag; /* tag, not used if no tagging */ +unsigned long offset; /* Offset of this field in structure */ +#ifndef NO_ASN1_FIELD_NAMES +const char *field_name; /* Field name */ +#endif +ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ +}; + +/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ + +#define ASN1_TEMPLATE_item(t) (t->item_ptr) +#define ASN1_TEMPLATE_adb(t) (t->item_ptr) + +typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; +typedef struct ASN1_ADB_st ASN1_ADB; + +struct ASN1_ADB_st { + unsigned long flags; /* Various flags */ + unsigned long offset; /* Offset of selector field */ + STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */ + const ASN1_ADB_TABLE *tbl; /* Table of possible types */ + long tblcount; /* Number of entries in tbl */ + const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ + const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ +}; + +struct ASN1_ADB_TABLE_st { + long value; /* NID for an object or value for an int */ + const ASN1_TEMPLATE tt; /* item for this value */ +}; + +/* template flags */ + +/* Field is optional */ +#define ASN1_TFLG_OPTIONAL (0x1) + +/* Field is a SET OF */ +#define ASN1_TFLG_SET_OF (0x1 << 1) + +/* Field is a SEQUENCE OF */ +#define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) + +/* Special case: this refers to a SET OF that + * will be sorted into DER order when encoded *and* + * the corresponding STACK will be modified to match + * the new order. + */ +#define ASN1_TFLG_SET_ORDER (0x3 << 1) + +/* Mask for SET OF or SEQUENCE OF */ +#define ASN1_TFLG_SK_MASK (0x3 << 1) + +/* These flags mean the tag should be taken from the + * tag field. If EXPLICIT then the underlying type + * is used for the inner tag. + */ + +/* IMPLICIT tagging */ +#define ASN1_TFLG_IMPTAG (0x1 << 3) + + +/* EXPLICIT tagging, inner tag from underlying type */ +#define ASN1_TFLG_EXPTAG (0x2 << 3) + +#define ASN1_TFLG_TAG_MASK (0x3 << 3) + +/* context specific IMPLICIT */ +#define ASN1_TFLG_IMPLICIT ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT + +/* context specific EXPLICIT */ +#define ASN1_TFLG_EXPLICIT ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT + +/* If tagging is in force these determine the + * type of tag to use. Otherwise the tag is + * determined by the underlying type. These + * values reflect the actual octet format. + */ + +/* Universal tag */ +#define ASN1_TFLG_UNIVERSAL (0x0<<6) +/* Application tag */ +#define ASN1_TFLG_APPLICATION (0x1<<6) +/* Context specific tag */ +#define ASN1_TFLG_CONTEXT (0x2<<6) +/* Private tag */ +#define ASN1_TFLG_PRIVATE (0x3<<6) + +#define ASN1_TFLG_TAG_CLASS (0x3<<6) + +/* These are for ANY DEFINED BY type. In this case + * the 'item' field points to an ASN1_ADB structure + * which contains a table of values to decode the + * relevant type + */ + +#define ASN1_TFLG_ADB_MASK (0x3<<8) + +#define ASN1_TFLG_ADB_OID (0x1<<8) + +#define ASN1_TFLG_ADB_INT (0x1<<9) + +/* This flag means a parent structure is passed + * instead of the field: this is useful is a + * SEQUENCE is being combined with a CHOICE for + * example. Since this means the structure and + * item name will differ we need to use the + * ASN1_CHOICE_END_name() macro for example. + */ + +#define ASN1_TFLG_COMBINE (0x1<<10) + +/* This flag when present in a SEQUENCE OF, SET OF + * or EXPLICIT causes indefinite length constructed + * encoding to be used if required. + */ + +#define ASN1_TFLG_NDEF (0x1<<11) + +/* This is the actual ASN1 item itself */ + +struct ASN1_ITEM_st { +char itype; /* The item type, primitive, SEQUENCE, CHOICE or extern */ +long utype; /* underlying type */ +const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains the contents */ +long tcount; /* Number of templates if SEQUENCE or CHOICE */ +const void *funcs; /* functions that handle this type */ +long size; /* Structure size (usually)*/ +#ifndef NO_ASN1_FIELD_NAMES +const char *sname; /* Structure name */ +#endif +}; + +/* These are values for the itype field and + * determine how the type is interpreted. + * + * For PRIMITIVE types the underlying type + * determines the behaviour if items is NULL. + * + * Otherwise templates must contain a single + * template and the type is treated in the + * same way as the type specified in the template. + * + * For SEQUENCE types the templates field points + * to the members, the size field is the + * structure size. + * + * For CHOICE types the templates field points + * to each possible member (typically a union) + * and the 'size' field is the offset of the + * selector. + * + * The 'funcs' field is used for application + * specific functions. + * + * For COMPAT types the funcs field gives a + * set of functions that handle this type, this + * supports the old d2i, i2d convention. + * + * The EXTERN type uses a new style d2i/i2d. + * The new style should be used where possible + * because it avoids things like the d2i IMPLICIT + * hack. + * + * MSTRING is a multiple string type, it is used + * for a CHOICE of character strings where the + * actual strings all occupy an ASN1_STRING + * structure. In this case the 'utype' field + * has a special meaning, it is used as a mask + * of acceptable types using the B_ASN1 constants. + * + * NDEF_SEQUENCE is the same as SEQUENCE except + * that it will use indefinite length constructed + * encoding if requested. + * + */ + +#define ASN1_ITYPE_PRIMITIVE 0x0 + +#define ASN1_ITYPE_SEQUENCE 0x1 + +#define ASN1_ITYPE_CHOICE 0x2 + +#define ASN1_ITYPE_COMPAT 0x3 + +#define ASN1_ITYPE_EXTERN 0x4 + +#define ASN1_ITYPE_MSTRING 0x5 + +#define ASN1_ITYPE_NDEF_SEQUENCE 0x6 + +/* Cache for ASN1 tag and length, so we + * don't keep re-reading it for things + * like CHOICE + */ + +struct ASN1_TLC_st{ + char valid; /* Values below are valid */ + int ret; /* return value */ + long plen; /* length */ + int ptag; /* class value */ + int pclass; /* class value */ + int hdrlen; /* header length */ +}; + +/* Typedefs for ASN1 function pointers */ + +typedef ASN1_VALUE * ASN1_new_func(void); +typedef void ASN1_free_func(ASN1_VALUE *a); +typedef ASN1_VALUE * ASN1_d2i_func(ASN1_VALUE **a, const unsigned char ** in, long length); +typedef int ASN1_i2d_func(ASN1_VALUE * a, unsigned char **in); + +typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, + int tag, int aclass, char opt, ASN1_TLC *ctx); + +typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass); +typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); +typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); + +typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it); +typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it); + +typedef struct ASN1_COMPAT_FUNCS_st { + ASN1_new_func *asn1_new; + ASN1_free_func *asn1_free; + ASN1_d2i_func *asn1_d2i; + ASN1_i2d_func *asn1_i2d; +} ASN1_COMPAT_FUNCS; + +typedef struct ASN1_EXTERN_FUNCS_st { + void *app_data; + ASN1_ex_new_func *asn1_ex_new; + ASN1_ex_free_func *asn1_ex_free; + ASN1_ex_free_func *asn1_ex_clear; + ASN1_ex_d2i *asn1_ex_d2i; + ASN1_ex_i2d *asn1_ex_i2d; +} ASN1_EXTERN_FUNCS; + +typedef struct ASN1_PRIMITIVE_FUNCS_st { + void *app_data; + unsigned long flags; + ASN1_ex_new_func *prim_new; + ASN1_ex_free_func *prim_free; + ASN1_ex_free_func *prim_clear; + ASN1_primitive_c2i *prim_c2i; + ASN1_primitive_i2c *prim_i2c; +} ASN1_PRIMITIVE_FUNCS; + +/* This is the ASN1_AUX structure: it handles various + * miscellaneous requirements. For example the use of + * reference counts and an informational callback. + * + * The "informational callback" is called at various + * points during the ASN1 encoding and decoding. It can + * be used to provide minor customisation of the structures + * used. This is most useful where the supplied routines + * *almost* do the right thing but need some extra help + * at a few points. If the callback returns zero then + * it is assumed a fatal error has occurred and the + * main operation should be abandoned. + * + * If major changes in the default behaviour are required + * then an external type is more appropriate. + */ + +typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it); + +typedef struct ASN1_AUX_st { + void *app_data; + int flags; + int ref_offset; /* Offset of reference value */ + int ref_lock; /* Lock type to use */ + ASN1_aux_cb *asn1_cb; + int enc_offset; /* Offset of ASN1_ENCODING structure */ +} ASN1_AUX; + +/* Flags in ASN1_AUX */ + +/* Use a reference count */ +#define ASN1_AFLG_REFCOUNT 1 +/* Save the encoding of structure (useful for signatures) */ +#define ASN1_AFLG_ENCODING 2 +/* The Sequence length is invalid */ +#define ASN1_AFLG_BROKEN 4 + +/* operation values for asn1_cb */ + +#define ASN1_OP_NEW_PRE 0 +#define ASN1_OP_NEW_POST 1 +#define ASN1_OP_FREE_PRE 2 +#define ASN1_OP_FREE_POST 3 +#define ASN1_OP_D2I_PRE 4 +#define ASN1_OP_D2I_POST 5 +#define ASN1_OP_I2D_PRE 6 +#define ASN1_OP_I2D_POST 7 + +/* Macro to implement a primitive type */ +#define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) +#define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement a multi string type */ +#define IMPLEMENT_ASN1_MSTRING(itname, mask) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement an ASN1_ITEM in terms of old style funcs */ + +#define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE) + +#define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \ + static const ASN1_COMPAT_FUNCS sname##_ff = { \ + (ASN1_new_func *)sname##_new, \ + (ASN1_free_func *)sname##_free, \ + (ASN1_d2i_func *)d2i_##sname, \ + (ASN1_i2d_func *)i2d_##sname, \ + }; \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_COMPAT, \ + tag, \ + NULL, \ + 0, \ + &sname##_ff, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +#define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_EXTERN, \ + tag, \ + NULL, \ + 0, \ + &fptrs, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +/* Macro to implement standard functions in terms of ASN1_ITEM structures */ + +#define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) + +#define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) + +#define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ + IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) + +#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) + +#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ + stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +#define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +#define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ + int i2d_##stname##_NDEF(stname *a, unsigned char **out) \ + { \ + return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\ + } + +/* This includes evil casts to remove const: they will go away when full + * ASN1 constification is done. + */ +#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +#define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ + stname * stname##_dup(stname *x) \ + { \ + return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ + } + +#define IMPLEMENT_ASN1_FUNCTIONS_const(name) \ + IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name) + +#define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +/* external definitions for primitive types */ + +DECLARE_ASN1_ITEM(ASN1_BOOLEAN) +DECLARE_ASN1_ITEM(ASN1_TBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_SEQUENCE) +DECLARE_ASN1_ITEM(CBIGNUM) +DECLARE_ASN1_ITEM(BIGNUM) +DECLARE_ASN1_ITEM(LONG) +DECLARE_ASN1_ITEM(ZLONG) + +DECLARE_STACK_OF(ASN1_VALUE) + +/* Functions used internally by the ASN1 code */ + +int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); +void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it); + +void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_TEMPLATE *tt); +int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, + int tag, int aclass, char opt, ASN1_TLC *ctx); + +int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass); +int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_TEMPLATE *tt); +void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it); + +int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it); +int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it); + +int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_set_choice_selector(ASN1_VALUE **pval, int value, const ASN1_ITEM *it); + +ASN1_VALUE ** asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); + +const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, int nullerr); + +int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it); + +void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it); +void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, const ASN1_ITEM *it); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/bio.h b/mswin32/OpenSSL/include/openssl/bio.h new file mode 100755 index 000000000..0362bb90c --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/bio.h @@ -0,0 +1,775 @@ +/* crypto/bio/bio.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.] + */ + +#ifndef HEADER_BIO_H +#define HEADER_BIO_H + +#include + +#ifndef OPENSSL_NO_FP_API +# include +#endif +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* These are the 'types' of BIOs */ +#define BIO_TYPE_NONE 0 +#define BIO_TYPE_MEM (1|0x0400) +#define BIO_TYPE_FILE (2|0x0400) + +#define BIO_TYPE_FD (4|0x0400|0x0100) +#define BIO_TYPE_SOCKET (5|0x0400|0x0100) +#define BIO_TYPE_NULL (6|0x0400) +#define BIO_TYPE_SSL (7|0x0200) +#define BIO_TYPE_MD (8|0x0200) /* passive filter */ +#define BIO_TYPE_BUFFER (9|0x0200) /* filter */ +#define BIO_TYPE_CIPHER (10|0x0200) /* filter */ +#define BIO_TYPE_BASE64 (11|0x0200) /* filter */ +#define BIO_TYPE_CONNECT (12|0x0400|0x0100) /* socket - connect */ +#define BIO_TYPE_ACCEPT (13|0x0400|0x0100) /* socket for accept */ +#define BIO_TYPE_PROXY_CLIENT (14|0x0200) /* client proxy BIO */ +#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_BIO (19|0x0400) /* (half a) BIO pair */ +#define BIO_TYPE_LINEBUFFER (20|0x0200) /* filter */ +#define BIO_TYPE_DGRAM (21|0x0400|0x0100) + +#define BIO_TYPE_DESCRIPTOR 0x0100 /* socket, fd, connect or accept */ +#define BIO_TYPE_FILTER 0x0200 +#define BIO_TYPE_SOURCE_SINK 0x0400 + +/* BIO_FILENAME_READ|BIO_CLOSE to open or close on free. + * BIO_set_fp(in,stdin,BIO_NOCLOSE); */ +#define BIO_NOCLOSE 0x00 +#define BIO_CLOSE 0x01 + +/* These are used in the following macros and are passed to + * BIO_ctrl() */ +#define BIO_CTRL_RESET 1 /* opt - rewind/zero etc */ +#define BIO_CTRL_EOF 2 /* opt - are we at the eof */ +#define BIO_CTRL_INFO 3 /* opt - extra tit-bits */ +#define BIO_CTRL_SET 4 /* man - set the 'IO' type */ +#define BIO_CTRL_GET 5 /* man - get the 'IO' type */ +#define BIO_CTRL_PUSH 6 /* opt - internal, used to signify change */ +#define BIO_CTRL_POP 7 /* opt - internal, used to signify change */ +#define BIO_CTRL_GET_CLOSE 8 /* man - set the 'close' on free */ +#define BIO_CTRL_SET_CLOSE 9 /* man - set the 'close' on free */ +#define BIO_CTRL_PENDING 10 /* opt - is their more data buffered */ +#define BIO_CTRL_FLUSH 11 /* opt - 'flush' buffered output */ +#define BIO_CTRL_DUP 12 /* man - extra stuff for 'duped' BIO */ +#define BIO_CTRL_WPENDING 13 /* opt - number of bytes still to write */ +/* callback is int cb(BIO *bio,state,ret); */ +#define BIO_CTRL_SET_CALLBACK 14 /* opt - set callback function */ +#define BIO_CTRL_GET_CALLBACK 15 /* opt - set callback function */ + +#define BIO_CTRL_SET_FILENAME 30 /* BIO_s_file special */ + +/* dgram BIO stuff */ +#define BIO_CTRL_DGRAM_CONNECT 31 /* BIO dgram special */ +#define BIO_CTRL_DGRAM_SET_CONNECTED 32 /* allow for an externally + * connected socket to be + * passed in */ +#define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33 /* setsockopt, essentially */ +#define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34 /* getsockopt, essentially */ +#define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35 /* setsockopt, essentially */ +#define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36 /* getsockopt, essentially */ + +#define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */ +#define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation tiemd out */ + +/* #ifdef IP_MTU_DISCOVER */ +#define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */ +/* #endif */ + +#define BIO_CTRL_DGRAM_QUERY_MTU 40 /* as kernel for current MTU */ +#define BIO_CTRL_DGRAM_GET_MTU 41 /* get cached value for MTU */ +#define BIO_CTRL_DGRAM_SET_MTU 42 /* set cached value for + * MTU. want to use this + * if asking the kernel + * fails */ + +#define BIO_CTRL_DGRAM_MTU_EXCEEDED 43 /* check whether the MTU + * was exceed in the + * previous write + * operation */ + +#define BIO_CTRL_DGRAM_SET_PEER 44 /* Destination for the data */ + + +/* modifiers */ +#define BIO_FP_READ 0x02 +#define BIO_FP_WRITE 0x04 +#define BIO_FP_APPEND 0x08 +#define BIO_FP_TEXT 0x10 + +#define BIO_FLAGS_READ 0x01 +#define BIO_FLAGS_WRITE 0x02 +#define BIO_FLAGS_IO_SPECIAL 0x04 +#define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL) +#define BIO_FLAGS_SHOULD_RETRY 0x08 +#ifndef BIO_FLAGS_UPLINK +/* "UPLINK" flag denotes file descriptors provided by application. + It defaults to 0, as most platforms don't require UPLINK interface. */ +#define BIO_FLAGS_UPLINK 0 +#endif + +/* Used in BIO_gethostbyname() */ +#define BIO_GHBN_CTRL_HITS 1 +#define BIO_GHBN_CTRL_MISSES 2 +#define BIO_GHBN_CTRL_CACHE_SIZE 3 +#define BIO_GHBN_CTRL_GET_ENTRY 4 +#define BIO_GHBN_CTRL_FLUSH 5 + +/* Mostly used in the SSL BIO */ +/* Not used anymore + * #define BIO_FLAGS_PROTOCOL_DELAYED_READ 0x10 + * #define BIO_FLAGS_PROTOCOL_DELAYED_WRITE 0x20 + * #define BIO_FLAGS_PROTOCOL_STARTUP 0x40 + */ + +#define BIO_FLAGS_BASE64_NO_NL 0x100 + +/* This is used with memory BIOs: it means we shouldn't free up or change the + * data in any way. + */ +#define BIO_FLAGS_MEM_RDONLY 0x200 + +typedef struct bio_st BIO; + +void BIO_set_flags(BIO *b, int flags); +int BIO_test_flags(const BIO *b, int flags); +void BIO_clear_flags(BIO *b, int flags); + +#define BIO_get_flags(b) BIO_test_flags(b, ~(0x0)) +#define BIO_set_retry_special(b) \ + BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY)) +#define BIO_set_retry_read(b) \ + BIO_set_flags(b, (BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY)) +#define BIO_set_retry_write(b) \ + BIO_set_flags(b, (BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY)) + +/* These are normally used internally in BIOs */ +#define BIO_clear_retry_flags(b) \ + BIO_clear_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) +#define BIO_get_retry_flags(b) \ + BIO_test_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) + +/* These should be used by the application to tell why we should retry */ +#define BIO_should_read(a) BIO_test_flags(a, BIO_FLAGS_READ) +#define BIO_should_write(a) BIO_test_flags(a, BIO_FLAGS_WRITE) +#define BIO_should_io_special(a) BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL) +#define BIO_retry_type(a) BIO_test_flags(a, BIO_FLAGS_RWS) +#define BIO_should_retry(a) BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY) + +/* The next three are used in conjunction with the + * BIO_should_io_special() condition. After this returns true, + * BIO *BIO_get_retry_BIO(BIO *bio, int *reason); will walk the BIO + * stack and return the 'reason' for the special and the offending BIO. + * Given a BIO, BIO_get_retry_reason(bio) will return the code. */ +/* Returned from the SSL bio when the certificate retrieval code had an error */ +#define BIO_RR_SSL_X509_LOOKUP 0x01 +/* Returned from the connect BIO when a connect would have blocked */ +#define BIO_RR_CONNECT 0x02 +/* Returned from the accept BIO when an accept would have blocked */ +#define BIO_RR_ACCEPT 0x03 + +/* These are passed by the BIO callback */ +#define BIO_CB_FREE 0x01 +#define BIO_CB_READ 0x02 +#define BIO_CB_WRITE 0x03 +#define BIO_CB_PUTS 0x04 +#define BIO_CB_GETS 0x05 +#define BIO_CB_CTRL 0x06 + +/* The callback is called before and after the underling operation, + * The BIO_CB_RETURN flag indicates if it is after the call */ +#define BIO_CB_RETURN 0x80 +#define BIO_CB_return(a) ((a)|BIO_CB_RETURN)) +#define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) +#define BIO_cb_post(a) ((a)&BIO_CB_RETURN) + +long (*BIO_get_callback(const BIO *b)) (struct bio_st *,int,const char *,int, long,long); +void BIO_set_callback(BIO *b, + long (*callback)(struct bio_st *,int,const char *,int, long,long)); +char *BIO_get_callback_arg(const BIO *b); +void BIO_set_callback_arg(BIO *b, char *arg); + +const char * BIO_method_name(const BIO *b); +int BIO_method_type(const BIO *b); + +typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long); + +#ifndef OPENSSL_SYS_WIN16 +typedef struct bio_method_st + { + int type; + const char *name; + int (*bwrite)(BIO *, const char *, int); + int (*bread)(BIO *, char *, int); + int (*bputs)(BIO *, const char *); + int (*bgets)(BIO *, char *, int); + long (*ctrl)(BIO *, int, long, void *); + int (*create)(BIO *); + int (*destroy)(BIO *); + long (*callback_ctrl)(BIO *, int, bio_info_cb *); + } BIO_METHOD; +#else +typedef struct bio_method_st + { + int type; + const char *name; + int (_far *bwrite)(); + int (_far *bread)(); + int (_far *bputs)(); + int (_far *bgets)(); + long (_far *ctrl)(); + int (_far *create)(); + int (_far *destroy)(); + long (_far *callback_ctrl)(); + } BIO_METHOD; +#endif + +struct bio_st + { + BIO_METHOD *method; + /* bio, mode, argp, argi, argl, ret */ + long (*callback)(struct bio_st *,int,const char *,int, long,long); + char *cb_arg; /* first argument for the callback */ + + int init; + int shutdown; + int flags; /* extra storage */ + int retry_reason; + int num; + void *ptr; + struct bio_st *next_bio; /* used by filter BIOs */ + struct bio_st *prev_bio; /* used by filter BIOs */ + int references; + unsigned long num_read; + unsigned long num_write; + + CRYPTO_EX_DATA ex_data; + }; + +DECLARE_STACK_OF(BIO) + +typedef struct bio_f_buffer_ctx_struct + { + /* BIO *bio; */ /* this is now in the BIO struct */ + int ibuf_size; /* how big is the input buffer */ + int obuf_size; /* how big is the output buffer */ + + char *ibuf; /* the char array */ + int ibuf_len; /* how many bytes are in it */ + int ibuf_off; /* write/read offset */ + + char *obuf; /* the char array */ + int obuf_len; /* how many bytes are in it */ + int obuf_off; /* write/read offset */ + } BIO_F_BUFFER_CTX; + +/* connect BIO stuff */ +#define BIO_CONN_S_BEFORE 1 +#define BIO_CONN_S_GET_IP 2 +#define BIO_CONN_S_GET_PORT 3 +#define BIO_CONN_S_CREATE_SOCKET 4 +#define BIO_CONN_S_CONNECT 5 +#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_C_SET_CONNECT 100 +#define BIO_C_DO_STATE_MACHINE 101 +#define BIO_C_SET_NBIO 102 +#define BIO_C_SET_PROXY_PARAM 103 +#define BIO_C_SET_FD 104 +#define BIO_C_GET_FD 105 +#define BIO_C_SET_FILE_PTR 106 +#define BIO_C_GET_FILE_PTR 107 +#define BIO_C_SET_FILENAME 108 +#define BIO_C_SET_SSL 109 +#define BIO_C_GET_SSL 110 +#define BIO_C_SET_MD 111 +#define BIO_C_GET_MD 112 +#define BIO_C_GET_CIPHER_STATUS 113 +#define BIO_C_SET_BUF_MEM 114 +#define BIO_C_GET_BUF_MEM_PTR 115 +#define BIO_C_GET_BUFF_NUM_LINES 116 +#define BIO_C_SET_BUFF_SIZE 117 +#define BIO_C_SET_ACCEPT 118 +#define BIO_C_SSL_MODE 119 +#define BIO_C_GET_MD_CTX 120 +#define BIO_C_GET_PROXY_PARAM 121 +#define BIO_C_SET_BUFF_READ_DATA 122 /* data to read first */ +#define BIO_C_GET_CONNECT 123 +#define BIO_C_GET_ACCEPT 124 +#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_C_SET_WRITE_BUF_SIZE 136/* for BIO_s_bio */ +#define BIO_C_GET_WRITE_BUF_SIZE 137 +#define BIO_C_MAKE_BIO_PAIR 138 +#define BIO_C_DESTROY_BIO_PAIR 139 +#define BIO_C_GET_WRITE_GUARANTEE 140 +#define BIO_C_GET_READ_REQUEST 141 +#define BIO_C_SHUTDOWN_WR 142 +#define BIO_C_NREAD0 143 +#define BIO_C_NREAD 144 +#define BIO_C_NWRITE0 145 +#define BIO_C_NWRITE 146 +#define BIO_C_RESET_READ_REQUEST 147 +#define BIO_C_SET_MD_CTX 148 + + +#define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,arg) +#define BIO_get_app_data(s) BIO_get_ex_data(s,0) + +/* 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) +#define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port) +#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) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2) +#define BIO_get_conn_int_port(b) BIO_int_ctrl(b,BIO_C_GET_CONNECT,3) + + +#define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) + +/* BIO_s_accept_socket() */ +#define BIO_set_accept_port(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0,(char *)name) +#define BIO_get_accept_port(b) BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0) +/* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */ +#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) + +/* BIO_s_proxy_client() */ +#define BIO_set_url(b,url) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,0,(char *)(url)) +#define BIO_set_proxies(b,p) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,1,(char *)(p)) +/* BIO_set_nbio(b,n) */ +#define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s)) +/* BIO *BIO_get_filter_bio(BIO *bio); */ +#define BIO_set_proxy_cb(b,cb) BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(void *(*cb)())) +#define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk) +#define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool) + +#define BIO_get_proxy_header(b,skp) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,0,(char *)skp) +#define BIO_get_proxies(b,pxy_p) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,1,(char *)(pxy_p)) +#define BIO_get_url(b,url) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,2,(char *)(url)) +#define BIO_get_no_connect_return(b) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,5,NULL) + +#define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd) +#define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c) + +#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) + +/* name is cast to lose const, but might be better to route through a function + so we can do it safely */ +#ifdef CONST_STRICT +/* If you are wondering why this isn't defined, its because CONST_STRICT is + * purely a compile-time kludge to allow const to be checked. + */ +int BIO_read_filename(BIO *b,const char *name); +#else +#define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ,(char *)name) +#endif +#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 + * the next_bio field in the bio. So when you free the BIO, make sure + * you are doing a BIO_free_all() to catch the underlying BIO. */ +#define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl) +#define BIO_get_ssl(b,sslp) BIO_ctrl(b,BIO_C_GET_SSL,0,(char *)sslp) +#define BIO_set_ssl_mode(b,client) BIO_ctrl(b,BIO_C_SSL_MODE,client,NULL) +#define BIO_set_ssl_renegotiate_bytes(b,num) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL); +#define BIO_get_num_renegotiates(b) \ + BIO_ctrl(b,BIO_C_GET_SSL_NUM_RENEGOTIATES,0,NULL); +#define BIO_set_ssl_renegotiate_timeout(b,seconds) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL); + +/* 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) +#define BIO_set_buffer_size(b,size) BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,NULL) +#define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0) +#define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1) +#define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf) + +/* Don't use the next one unless you know what you are doing :-) */ +#define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)(ret)) + +#define BIO_reset(b) (int)BIO_ctrl(b,BIO_CTRL_RESET,0,NULL) +#define BIO_eof(b) (int)BIO_ctrl(b,BIO_CTRL_EOF,0,NULL) +#define BIO_set_close(b,c) (int)BIO_ctrl(b,BIO_CTRL_SET_CLOSE,(c),NULL) +#define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL) +#define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) +#define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) +/* ...pending macros have inappropriate return type */ +size_t BIO_ctrl_pending(BIO *b); +size_t BIO_ctrl_wpending(BIO *b); +#define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) +#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0, \ + cbp) +#define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,cb) + +/* For the BIO_f_buffer() type */ +#define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) + +/* For BIO_s_bio() */ +#define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL) +#define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL) +#define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2) +#define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL) +#define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL) +/* macros with inappropriate type -- but ...pending macros use int too: */ +#define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL) +#define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL) +size_t BIO_ctrl_get_write_guarantee(BIO *b); +size_t BIO_ctrl_get_read_request(BIO *b); +int BIO_ctrl_reset_read_request(BIO *b); + +/* ctrl macros for dgram */ +#define BIO_ctrl_dgram_connect(b,peer) \ + (int)BIO_ctrl(b,BIO_CTRL_DGRAM_CONNECT,0, (char *)peer) +#define BIO_ctrl_set_connected(b, state, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, state, (char *)peer) +#define BIO_dgram_recv_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL) +#define BIO_dgram_send_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL) +#define BIO_dgram_set_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)peer) + +/* These two aren't currently implemented */ +/* int BIO_get_ex_num(BIO *bio); */ +/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ +int BIO_set_ex_data(BIO *bio,int idx,void *data); +void *BIO_get_ex_data(BIO *bio,int idx); +int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +unsigned long BIO_number_read(BIO *bio); +unsigned long BIO_number_written(BIO *bio); + +# ifndef OPENSSL_NO_FP_API +# if defined(OPENSSL_SYS_WIN16) && defined(_WINDLL) +BIO_METHOD *BIO_s_file_internal(void); +BIO *BIO_new_file_internal(char *filename, char *mode); +BIO *BIO_new_fp_internal(FILE *stream, int close_flag); +# define BIO_s_file BIO_s_file_internal +# define BIO_new_file BIO_new_file_internal +# define BIO_new_fp BIO_new_fp_internal +# else /* FP_API */ +BIO_METHOD *BIO_s_file(void ); +BIO *BIO_new_file(const char *filename, const char *mode); +BIO *BIO_new_fp(FILE *stream, int close_flag); +# define BIO_s_file_internal BIO_s_file +# define BIO_new_file_internal BIO_new_file +# define BIO_new_fp_internal BIO_s_file +# endif /* FP_API */ +# endif +BIO * BIO_new(BIO_METHOD *type); +int BIO_set(BIO *a,BIO_METHOD *type); +int BIO_free(BIO *a); +void BIO_vfree(BIO *a); +int BIO_read(BIO *b, void *data, int len); +int BIO_gets(BIO *bp,char *buf, int size); +int BIO_write(BIO *b, const void *data, int len); +int BIO_puts(BIO *bp,const char *buf); +int BIO_indent(BIO *b,int indent,int max); +long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg); +long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)); +char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg); +long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg); +BIO * BIO_push(BIO *b,BIO *append); +BIO * BIO_pop(BIO *b); +void BIO_free_all(BIO *a); +BIO * BIO_find_type(BIO *b,int bio_type); +BIO * BIO_next(BIO *b); +BIO * BIO_get_retry_BIO(BIO *bio, int *reason); +int BIO_get_retry_reason(BIO *bio); +BIO * BIO_dup_chain(BIO *in); + +int BIO_nread0(BIO *bio, char **buf); +int BIO_nread(BIO *bio, char **buf, int num); +int BIO_nwrite0(BIO *bio, char **buf); +int BIO_nwrite(BIO *bio, char **buf, int num); + +#ifndef OPENSSL_SYS_WIN16 +long BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi, + long argl,long ret); +#else +long _far _loadds BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi, + long argl,long ret); +#endif + +BIO_METHOD *BIO_s_mem(void); +BIO *BIO_new_mem_buf(void *buf, int len); +BIO_METHOD *BIO_s_socket(void); +BIO_METHOD *BIO_s_connect(void); +BIO_METHOD *BIO_s_accept(void); +BIO_METHOD *BIO_s_fd(void); +#ifndef OPENSSL_SYS_OS2 +BIO_METHOD *BIO_s_log(void); +#endif +BIO_METHOD *BIO_s_bio(void); +BIO_METHOD *BIO_s_null(void); +BIO_METHOD *BIO_f_null(void); +BIO_METHOD *BIO_f_buffer(void); +#ifdef OPENSSL_SYS_VMS +BIO_METHOD *BIO_f_linebuffer(void); +#endif +BIO_METHOD *BIO_f_nbio_test(void); +#ifndef OPENSSL_NO_DGRAM +BIO_METHOD *BIO_s_datagram(void); +#endif + +/* BIO_METHOD *BIO_f_ber(void); */ + +int BIO_sock_should_retry(int i); +int BIO_sock_non_fatal_error(int error); +int BIO_dgram_non_fatal_error(int error); + +int BIO_fd_should_retry(int i); +int BIO_fd_non_fatal_error(int error); +int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), + void *u, const char *s, int len); +int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), + void *u, const char *s, int len, int indent); +int BIO_dump(BIO *b,const char *bytes,int len); +int BIO_dump_indent(BIO *b,const char *bytes,int len,int indent); +#ifndef OPENSSL_NO_FP_API +int BIO_dump_fp(FILE *fp, const char *s, int len); +int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); +#endif +struct hostent *BIO_gethostbyname(const char *name); +/* We might want a thread-safe interface too: + * struct hostent *BIO_gethostbyname_r(const char *name, + * struct hostent *result, void *buffer, size_t buflen); + * or something similar (caller allocates a struct hostent, + * pointed to by "result", and additional buffer space for the various + * substructures; if the buffer does not suffice, NULL is returned + * and an appropriate error code is set). + */ +int BIO_sock_error(int sock); +int BIO_socket_ioctl(int fd, long type, void *arg); +int BIO_socket_nbio(int fd,int mode); +int BIO_get_port(const char *str, unsigned short *port_ptr); +int BIO_get_host_ip(const char *str, unsigned char *ip); +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); +int BIO_set_tcp_ndelay(int sock,int turn_on); + +BIO *BIO_new_socket(int sock, int close_flag); +BIO *BIO_new_dgram(int fd, int close_flag); +BIO *BIO_new_fd(int fd, int close_flag); +BIO *BIO_new_connect(char *host_port); +BIO *BIO_new_accept(char *host_port); + +int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, + BIO **bio2, size_t writebuf2); +/* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. + * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. + * Size 0 uses default value. + */ + +void BIO_copy_next_retry(BIO *b); + +/*long BIO_ghbn_ctrl(int cmd,int iarg,char *parg);*/ + +#ifdef __GNUC__ +# define __bio_h__attr__ __attribute__ +#else +# define __bio_h__attr__(x) +#endif +int BIO_printf(BIO *bio, const char *format, ...) + __bio_h__attr__((__format__(__printf__,2,3))); +int BIO_vprintf(BIO *bio, const char *format, va_list args) + __bio_h__attr__((__format__(__printf__,2,0))); +int BIO_snprintf(char *buf, size_t n, const char *format, ...) + __bio_h__attr__((__format__(__printf__,3,4))); +int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) + __bio_h__attr__((__format__(__printf__,3,0))); +#undef __bio_h__attr__ + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BIO_strings(void); + +/* Error codes for the BIO functions. */ + +/* Function codes. */ +#define BIO_F_ACPT_STATE 100 +#define BIO_F_BIO_ACCEPT 101 +#define BIO_F_BIO_BER_GET_HEADER 102 +#define BIO_F_BIO_CALLBACK_CTRL 131 +#define BIO_F_BIO_CTRL 103 +#define BIO_F_BIO_GETHOSTBYNAME 120 +#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_MAKE_PAIR 121 +#define BIO_F_BIO_NEW 108 +#define BIO_F_BIO_NEW_FILE 109 +#define BIO_F_BIO_NEW_MEM_BUF 126 +#define BIO_F_BIO_NREAD 123 +#define BIO_F_BIO_NREAD0 124 +#define BIO_F_BIO_NWRITE 125 +#define BIO_F_BIO_NWRITE0 122 +#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_CTRL 127 +#define BIO_F_CONN_STATE 115 +#define BIO_F_FILE_CTRL 116 +#define BIO_F_FILE_READ 130 +#define BIO_F_LINEBUFFER_CTRL 129 +#define BIO_F_MEM_READ 128 +#define BIO_F_MEM_WRITE 117 +#define BIO_F_SSL_NEW 118 +#define BIO_F_WSASTARTUP 119 + +/* Reason codes. */ +#define BIO_R_ACCEPT_ERROR 100 +#define BIO_R_BAD_FOPEN_MODE 101 +#define BIO_R_BAD_HOSTNAME_LOOKUP 102 +#define BIO_R_BROKEN_PIPE 124 +#define BIO_R_CONNECT_ERROR 103 +#define BIO_R_EOF_ON_MEMORY_BIO 127 +#define BIO_R_ERROR_SETTING_NBIO 104 +#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET 105 +#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106 +#define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 +#define BIO_R_INVALID_ARGUMENT 125 +#define BIO_R_INVALID_IP_ADDRESS 108 +#define BIO_R_IN_USE 123 +#define BIO_R_KEEPALIVE 109 +#define BIO_R_NBIO_CONNECT_ERROR 110 +#define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111 +#define BIO_R_NO_HOSTNAME_SPECIFIED 112 +#define BIO_R_NO_PORT_DEFINED 113 +#define BIO_R_NO_PORT_SPECIFIED 114 +#define BIO_R_NO_SUCH_FILE 128 +#define BIO_R_NULL_PARAMETER 115 +#define BIO_R_TAG_MISMATCH 116 +#define BIO_R_UNABLE_TO_BIND_SOCKET 117 +#define BIO_R_UNABLE_TO_CREATE_SOCKET 118 +#define BIO_R_UNABLE_TO_LISTEN_SOCKET 119 +#define BIO_R_UNINITIALIZED 120 +#define BIO_R_UNSUPPORTED_METHOD 121 +#define BIO_R_WRITE_TO_READ_ONLY_BIO 126 +#define BIO_R_WSASTARTUP 122 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/blowfish.h b/mswin32/OpenSSL/include/openssl/blowfish.h new file mode 100755 index 000000000..cd49e85ab --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/blowfish.h @@ -0,0 +1,127 @@ +/* crypto/bf/blowfish.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.] + */ + +#ifndef HEADER_BLOWFISH_H +#define HEADER_BLOWFISH_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_NO_BF +#error BF is disabled. +#endif + +#define BF_ENCRYPT 1 +#define BF_DECRYPT 0 + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! BF_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! BF_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__) +#define BF_LONG unsigned long +#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +#define BF_LONG unsigned long +#define BF_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +#else +#define BF_LONG unsigned int +#endif + +#define BF_ROUNDS 16 +#define BF_BLOCK 8 + +typedef struct bf_key_st + { + BF_LONG P[BF_ROUNDS+2]; + BF_LONG S[4*256]; + } BF_KEY; + + +void BF_set_key(BF_KEY *key, int len, const unsigned char *data); + +void BF_encrypt(BF_LONG *data,const BF_KEY *key); +void BF_decrypt(BF_LONG *data,const BF_KEY *key); + +void BF_ecb_encrypt(const unsigned char *in, unsigned char *out, + const BF_KEY *key, int enc); +void BF_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + const BF_KEY *schedule, unsigned char *ivec, int enc); +void BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, long length, + const BF_KEY *schedule, unsigned char *ivec, int *num, int enc); +void BF_ofb64_encrypt(const unsigned char *in, unsigned char *out, long length, + const BF_KEY *schedule, unsigned char *ivec, int *num); +const char *BF_options(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/bn.h b/mswin32/OpenSSL/include/openssl/bn.h new file mode 100755 index 000000000..df6eea29a --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/bn.h @@ -0,0 +1,839 @@ +/* crypto/bn/bn.h */ +/* 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.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the Eric Young open source + * license provided above. + * + * The binary polynomial arithmetic software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_BN_H +#define HEADER_BN_H + +#include +#ifndef OPENSSL_NO_FP_API +#include /* FILE */ +#endif +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* These preprocessor symbols control various aspects of the bignum headers and + * library code. They're not defined by any "normal" configuration, as they are + * intended for development and testing purposes. NB: defining all three can be + * useful for debugging application code as well as openssl itself. + * + * BN_DEBUG - turn on various debugging alterations to the bignum code + * BN_DEBUG_RAND - uses random poisoning of unused words to trip up + * mismanagement of bignum internals. You must also define BN_DEBUG. + */ +/* #define BN_DEBUG */ +/* #define BN_DEBUG_RAND */ + +#define BN_MUL_COMBA +#define BN_SQR_COMBA +#define BN_RECURSION + +/* This next option uses the C libraries (2 word)/(1 word) function. + * If it is not defined, I use my C version (which is slower). + * The reason for this flag is that when the particular C compiler + * library routine is used, and the library is linked with a different + * compiler, the library is missing. This mostly happens when the + * library is built with gcc and then linked using normal cc. This would + * be a common occurrence because gcc normally produces code that is + * 2 times faster than system compilers for the big number stuff. + * For machines with only one compiler (or shared libraries), this should + * be on. Again this in only really a problem on machines + * using "long long's", are 32bit, and are not using my assembler code. */ +#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || \ + defined(OPENSSL_SYS_WIN32) || defined(linux) +# ifndef BN_DIV2W +# define BN_DIV2W +# endif +#endif + +/* 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 */ +#ifdef SIXTY_FOUR_BIT_LONG +#define BN_ULLONG unsigned long long +#define BN_ULONG unsigned long +#define BN_LONG long +#define BN_BITS 128 +#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 (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 relevant + * assembler code :-). Do NOT define BN_LLONG. + */ +#ifdef SIXTY_FOUR_BIT +#undef BN_LLONG +#undef BN_ULLONG +#define BN_ULONG unsigned long long +#define BN_LONG long long +#define BN_BITS 128 +#define BN_BYTES 8 +#define BN_BITS2 64 +#define BN_BITS4 32 +#define BN_MASK2 (0xffffffffffffffffLL) +#define BN_MASK2l (0xffffffffL) +#define BN_MASK2h (0xffffffff00000000LL) +#define BN_MASK2h1 (0xffffffff80000000LL) +#define BN_TBIT (0x8000000000000000LL) +#define BN_DEC_CONV (10000000000000000000ULL) +#define BN_DEC_FMT1 "%llu" +#define BN_DEC_FMT2 "%019llu" +#define BN_DEC_NUM 19 +#endif + +#ifdef THIRTY_TWO_BIT +#ifdef BN_LLONG +# if defined(OPENSSL_SYS_WIN32) && !defined(__GNUC__) +# define BN_ULLONG unsigned __int64 +# else +# define BN_ULLONG unsigned long long +# endif +#endif +#define BN_ULONG unsigned long +#define BN_LONG long +#define BN_BITS 64 +#define BN_BYTES 4 +#define BN_BITS2 32 +#define BN_BITS4 16 +#ifdef OPENSSL_SYS_WIN32 +/* VC++ doesn't like the LL suffix */ +#define BN_MASK (0xffffffffffffffffL) +#else +#define BN_MASK (0xffffffffffffffffLL) +#endif +#define BN_MASK2 (0xffffffffL) +#define BN_MASK2l (0xffff) +#define BN_MASK2h1 (0xffff8000L) +#define BN_MASK2h (0xffff0000L) +#define BN_TBIT (0x80000000L) +#define BN_DEC_CONV (1000000000L) +#define BN_DEC_FMT1 "%lu" +#define BN_DEC_FMT2 "%09lu" +#define BN_DEC_NUM 9 +#endif + +#ifdef SIXTEEN_BIT +#ifndef BN_DIV2W +#define BN_DIV2W +#endif +#define BN_ULLONG unsigned long +#define BN_ULONG unsigned short +#define BN_LONG short +#define BN_BITS 32 +#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) +#define BN_MASK2h (0xff00) +#define BN_TBIT (0x8000) +#define BN_DEC_CONV (100000) +#define BN_DEC_FMT1 "%u" +#define BN_DEC_FMT2 "%05u" +#define BN_DEC_NUM 5 +#endif + +#ifdef EIGHT_BIT +#ifndef BN_DIV2W +#define BN_DIV2W +#endif +#define BN_ULLONG unsigned short +#define BN_ULONG unsigned char +#define BN_LONG char +#define BN_BITS 16 +#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) +#define BN_MASK2h (0xf0) +#define BN_TBIT (0x80) +#define BN_DEC_CONV (100) +#define BN_DEC_FMT1 "%u" +#define BN_DEC_FMT2 "%02u" +#define BN_DEC_NUM 2 +#endif + +#define BN_DEFAULT_BITS 1280 + +#define BN_FLG_MALLOCED 0x01 +#define BN_FLG_STATIC_DATA 0x02 +#define BN_FLG_CONSTTIME 0x04 /* avoid leaking exponent information through timing, + * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime, + * BN_div() will call BN_div_no_branch, + * BN_mod_inverse() will call BN_mod_inverse_no_branch. + */ + +#ifndef OPENSSL_NO_DEPRECATED +#define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME /* deprecated name for the flag */ + /* avoid leaking exponent information through timings + * (BN_mod_exp_mont() will call BN_mod_exp_mont_consttime) */ +#endif + +#ifndef OPENSSL_NO_DEPRECATED +#define BN_FLG_FREE 0x8000 /* used for debuging */ +#endif +#define BN_set_flags(b,n) ((b)->flags|=(n)) +#define BN_get_flags(b,n) ((b)->flags&(n)) + +/* get a clone of a BIGNUM with changed flags, for *temporary* use only + * (the two BIGNUMs cannot not be used in parallel!) */ +#define BN_with_flags(dest,b,n) ((dest)->d=(b)->d, \ + (dest)->top=(b)->top, \ + (dest)->dmax=(b)->dmax, \ + (dest)->neg=(b)->neg, \ + (dest)->flags=(((dest)->flags & BN_FLG_MALLOCED) \ + | ((b)->flags & ~BN_FLG_MALLOCED) \ + | BN_FLG_STATIC_DATA \ + | (n))) + +/* Already declared in ossl_typ.h */ +#if 0 +typedef struct bignum_st BIGNUM; +/* Used for temp variables (declaration hidden in bn_lcl.h) */ +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; +#endif + +struct bignum_st + { + BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit chunks. */ + int top; /* Index of last used d +1. */ + /* The next are internal book keeping for bn_expand. */ + int dmax; /* Size of the d array. */ + int neg; /* one if the number is negative */ + int flags; + }; + +/* Used for montgomery multiplication */ +struct bn_mont_ctx_st + { + int ri; /* number of bits in R */ + BIGNUM RR; /* used to convert to montgomery form */ + BIGNUM N; /* The modulus */ + BIGNUM Ni; /* R*(1/R mod N) - N*Ni = 1 + * (Ni is only stored for bignum algorithm) */ + BN_ULONG n0; /* least significant word of Ni */ + int flags; + }; + +/* Used for reciprocal division/mod functions + * It cannot be shared between threads + */ +struct bn_recp_ctx_st + { + BIGNUM N; /* the divisor */ + BIGNUM Nr; /* the reciprocal */ + int num_bits; + int shift; + int flags; + }; + +/* Used for slow "generation" functions. */ +struct bn_gencb_st + { + unsigned int ver; /* To handle binary (in)compatibility */ + void *arg; /* callback-specific data */ + union + { + /* if(ver==1) - handles old style callbacks */ + void (*cb_1)(int, int, void *); + /* if(ver==2) - new callback style */ + int (*cb_2)(int, int, BN_GENCB *); + } cb; + }; +/* Wrapper function to make using BN_GENCB easier, */ +int BN_GENCB_call(BN_GENCB *cb, int a, int b); +/* Macro to populate a BN_GENCB structure with an "old"-style callback */ +#define BN_GENCB_set_old(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 1; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_1 = (callback); } +/* Macro to populate a BN_GENCB structure with a "new"-style callback */ +#define BN_GENCB_set(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 2; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_2 = (callback); } + +#define BN_prime_checks 0 /* default: select number of iterations + based on the size of the number */ + +/* number of Miller-Rabin iterations for an error rate of less than 2^-80 + * for random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook + * of Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996]; + * original paper: Damgaard, Landrock, Pomerance: Average case error estimates + * for the strong probable prime test. -- Math. Comp. 61 (1993) 177-194) */ +#define BN_prime_checks_for_size(b) ((b) >= 1300 ? 2 : \ + (b) >= 850 ? 3 : \ + (b) >= 650 ? 4 : \ + (b) >= 550 ? 5 : \ + (b) >= 450 ? 6 : \ + (b) >= 400 ? 7 : \ + (b) >= 350 ? 8 : \ + (b) >= 300 ? 9 : \ + (b) >= 250 ? 12 : \ + (b) >= 200 ? 15 : \ + (b) >= 150 ? 18 : \ + /* b >= 100 */ 27) + +#define BN_num_bytes(a) ((BN_num_bits(a)+7)/8) + +/* Note that BN_abs_is_word didn't work reliably for w == 0 until 0.9.8 */ +#define BN_abs_is_word(a,w) ((((a)->top == 1) && ((a)->d[0] == (BN_ULONG)(w))) || \ + (((w) == 0) && ((a)->top == 0))) +#define BN_is_zero(a) ((a)->top == 0) +#define BN_is_one(a) (BN_abs_is_word((a),1) && !(a)->neg) +#define BN_is_word(a,w) (BN_abs_is_word((a),(w)) && (!(w) || !(a)->neg)) +#define BN_is_odd(a) (((a)->top > 0) && ((a)->d[0] & 1)) + +#define BN_one(a) (BN_set_word((a),1)) +#define BN_zero_ex(a) \ + do { \ + BIGNUM *_tmp_bn = (a); \ + _tmp_bn->top = 0; \ + _tmp_bn->neg = 0; \ + } while(0) +#ifdef OPENSSL_NO_DEPRECATED +#define BN_zero(a) BN_zero_ex(a) +#else +#define BN_zero(a) (BN_set_word((a),0)) +#endif + +const BIGNUM *BN_value_one(void); +char * BN_options(void); +BN_CTX *BN_CTX_new(void); +#ifndef OPENSSL_NO_DEPRECATED +void BN_CTX_init(BN_CTX *c); +#endif +void BN_CTX_free(BN_CTX *c); +void BN_CTX_start(BN_CTX *ctx); +BIGNUM *BN_CTX_get(BN_CTX *ctx); +void BN_CTX_end(BN_CTX *ctx); +int BN_rand(BIGNUM *rnd, int bits, int top,int bottom); +int BN_pseudo_rand(BIGNUM *rnd, int bits, int top,int bottom); +int BN_rand_range(BIGNUM *rnd, BIGNUM *range); +int BN_pseudo_rand_range(BIGNUM *rnd, BIGNUM *range); +int BN_num_bits(const 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, const BIGNUM *b); +void BN_swap(BIGNUM *a, BIGNUM *b); +BIGNUM *BN_bin2bn(const unsigned char *s,int len,BIGNUM *ret); +int BN_bn2bin(const BIGNUM *a, unsigned char *to); +BIGNUM *BN_mpi2bn(const unsigned char *s,int len,BIGNUM *ret); +int BN_bn2mpi(const BIGNUM *a, unsigned char *to); +int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_sqr(BIGNUM *r, const BIGNUM *a,BN_CTX *ctx); +/** BN_set_negative sets sign of a BIGNUM + * \param b pointer to the BIGNUM object + * \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise + */ +void BN_set_negative(BIGNUM *b, int n); +/** BN_is_negative returns 1 if the BIGNUM is negative + * \param a pointer to the BIGNUM object + * \return 1 if a < 0 and 0 otherwise + */ +#define BN_is_negative(a) ((a)->neg != 0) + +int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d, + BN_CTX *ctx); +#define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx)) +int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx); +int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m); +int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m); +int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m, BN_CTX *ctx); +int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m); +int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m); + +BN_ULONG BN_mod_word(const 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(const BIGNUM *a); + +int BN_cmp(const BIGNUM *a, const BIGNUM *b); +void BN_free(BIGNUM *a); +int BN_is_bit_set(const BIGNUM *a, int n); +int BN_lshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_lshift1(BIGNUM *r, const BIGNUM *a); +int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,BN_CTX *ctx); + +int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m,BN_CTX *ctx); +int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont); +int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1, + const BIGNUM *a2, const BIGNUM *p2,const BIGNUM *m, + BN_CTX *ctx,BN_MONT_CTX *m_ctx); +int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m,BN_CTX *ctx); + +int BN_mask_bits(BIGNUM *a,int n); +#ifndef OPENSSL_NO_FP_API +int BN_print_fp(FILE *fp, const BIGNUM *a); +#endif +#ifdef HEADER_BIO_H +int BN_print(BIO *fp, const BIGNUM *a); +#else +int BN_print(void *fp, const BIGNUM *a); +#endif +int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx); +int BN_rshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_rshift1(BIGNUM *r, const BIGNUM *a); +void BN_clear(BIGNUM *a); +BIGNUM *BN_dup(const BIGNUM *a); +int BN_ucmp(const BIGNUM *a, const BIGNUM *b); +int BN_set_bit(BIGNUM *a, int n); +int BN_clear_bit(BIGNUM *a, int n); +char * BN_bn2hex(const BIGNUM *a); +char * BN_bn2dec(const BIGNUM *a); +int BN_hex2bn(BIGNUM **a, const char *str); +int BN_dec2bn(BIGNUM **a, const char *str); +int BN_gcd(BIGNUM *r,const BIGNUM *a,const BIGNUM *b,BN_CTX *ctx); +int BN_kronecker(const BIGNUM *a,const BIGNUM *b,BN_CTX *ctx); /* returns -2 for error */ +BIGNUM *BN_mod_inverse(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n,BN_CTX *ctx); +BIGNUM *BN_mod_sqrt(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n,BN_CTX *ctx); + +/* Deprecated versions */ +#ifndef OPENSSL_NO_DEPRECATED +BIGNUM *BN_generate_prime(BIGNUM *ret,int bits,int safe, + const BIGNUM *add, const BIGNUM *rem, + void (*callback)(int,int,void *),void *cb_arg); +int BN_is_prime(const BIGNUM *p,int nchecks, + void (*callback)(int,int,void *), + BN_CTX *ctx,void *cb_arg); +int BN_is_prime_fasttest(const BIGNUM *p,int nchecks, + void (*callback)(int,int,void *),BN_CTX *ctx,void *cb_arg, + int do_trial_division); +#endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* Newer versions */ +int BN_generate_prime_ex(BIGNUM *ret,int bits,int safe, const BIGNUM *add, + const BIGNUM *rem, BN_GENCB *cb); +int BN_is_prime_ex(const BIGNUM *p,int nchecks, BN_CTX *ctx, BN_GENCB *cb); +int BN_is_prime_fasttest_ex(const BIGNUM *p,int nchecks, BN_CTX *ctx, + int do_trial_division, BN_GENCB *cb); + +BN_MONT_CTX *BN_MONT_CTX_new(void ); +void BN_MONT_CTX_init(BN_MONT_CTX *ctx); +int BN_mod_mul_montgomery(BIGNUM *r,const BIGNUM *a,const BIGNUM *b, + BN_MONT_CTX *mont, BN_CTX *ctx); +#define BN_to_montgomery(r,a,mont,ctx) BN_mod_mul_montgomery(\ + (r),(a),&((mont)->RR),(mont),(ctx)) +int BN_from_montgomery(BIGNUM *r,const 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,const BIGNUM *mod,BN_CTX *ctx); +BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to,BN_MONT_CTX *from); +BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, int lock, + const BIGNUM *mod, BN_CTX *ctx); + +/* BN_BLINDING flags */ +#define BN_BLINDING_NO_UPDATE 0x00000001 +#define BN_BLINDING_NO_RECREATE 0x00000002 + +BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, /* const */ BIGNUM *mod); +void BN_BLINDING_free(BN_BLINDING *b); +int BN_BLINDING_update(BN_BLINDING *b,BN_CTX *ctx); +int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *); +int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, BN_CTX *); +unsigned long BN_BLINDING_get_thread_id(const BN_BLINDING *); +void BN_BLINDING_set_thread_id(BN_BLINDING *, unsigned long); +unsigned long BN_BLINDING_get_flags(const BN_BLINDING *); +void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long); +BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b, + const BIGNUM *e, /* const */ BIGNUM *m, BN_CTX *ctx, + int (*bn_mod_exp)(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx), + BN_MONT_CTX *m_ctx); + +#ifndef OPENSSL_NO_DEPRECATED +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 */ +#endif + +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,const BIGNUM *rdiv,BN_CTX *ctx); +int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, + BN_RECP_CTX *recp,BN_CTX *ctx); +int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, + BN_RECP_CTX *recp, BN_CTX *ctx); + +/* Functions for arithmetic over binary polynomials represented by BIGNUMs. + * + * The BIGNUM::neg property of BIGNUMs representing binary polynomials is + * ignored. + * + * Note that input arguments are not const so that their bit arrays can + * be expanded to the appropriate size if needed. + */ + +int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); /*r = a + b*/ +#define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b) +int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); /*r=a mod p*/ +int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); /* r = (a * b) mod p */ +int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); /* r = (a * a) mod p */ +int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, + BN_CTX *ctx); /* r = (1 / b) mod p */ +int BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); /* r = (a / b) mod p */ +int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); /* r = (a ^ b) mod p */ +int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); /* r = sqrt(a) mod p */ +int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); /* r^2 + r = a mod p */ +#define BN_GF2m_cmp(a, b) BN_ucmp((a), (b)) +/* Some functions allow for representation of the irreducible polynomials + * as an unsigned int[], say p. The irreducible f(t) is then of the form: + * t^p[0] + t^p[1] + ... + t^p[k] + * where m = p[0] > p[1] > ... > p[k] = 0. + */ +int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[]); + /* r = a mod p */ +int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const unsigned int p[], BN_CTX *ctx); /* r = (a * b) mod p */ +int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[], + BN_CTX *ctx); /* r = (a * a) mod p */ +int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const unsigned int p[], + BN_CTX *ctx); /* r = (1 / b) mod p */ +int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const unsigned int p[], BN_CTX *ctx); /* r = (a / b) mod p */ +int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const unsigned int p[], BN_CTX *ctx); /* r = (a ^ b) mod p */ +int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, + const unsigned int p[], BN_CTX *ctx); /* r = sqrt(a) mod p */ +int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, + const unsigned int p[], BN_CTX *ctx); /* r^2 + r = a mod p */ +int BN_GF2m_poly2arr(const BIGNUM *a, unsigned int p[], int max); +int BN_GF2m_arr2poly(const unsigned int p[], BIGNUM *a); + +/* faster mod functions for the 'NIST primes' + * 0 <= a < p^2 */ +int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +const BIGNUM *BN_get0_nist_prime_192(void); +const BIGNUM *BN_get0_nist_prime_224(void); +const BIGNUM *BN_get0_nist_prime_256(void); +const BIGNUM *BN_get0_nist_prime_384(void); +const BIGNUM *BN_get0_nist_prime_521(void); + +/* library internal functions */ + +#define bn_expand(a,bits) ((((((bits+BN_BITS2-1))/BN_BITS2)) <= (a)->dmax)?\ + (a):bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2)) +#define bn_wexpand(a,words) (((words) <= (a)->dmax)?(a):bn_expand2((a),(words))) +BIGNUM *bn_expand2(BIGNUM *a, int words); +#ifndef OPENSSL_NO_DEPRECATED +BIGNUM *bn_dup_expand(const BIGNUM *a, int words); /* unused */ +#endif + +/* Bignum consistency macros + * There is one "API" macro, bn_fix_top(), for stripping leading zeroes from + * bignum data after direct manipulations on the data. There is also an + * "internal" macro, bn_check_top(), for verifying that there are no leading + * zeroes. Unfortunately, some auditing is required due to the fact that + * bn_fix_top() has become an overabused duct-tape because bignum data is + * occasionally passed around in an inconsistent state. So the following + * changes have been made to sort this out; + * - bn_fix_top()s implementation has been moved to bn_correct_top() + * - if BN_DEBUG isn't defined, bn_fix_top() maps to bn_correct_top(), and + * bn_check_top() is as before. + * - if BN_DEBUG *is* defined; + * - bn_check_top() tries to pollute unused words even if the bignum 'top' is + * consistent. (ed: only if BN_DEBUG_RAND is defined) + * - bn_fix_top() maps to bn_check_top() rather than "fixing" anything. + * The idea is to have debug builds flag up inconsistent bignums when they + * occur. If that occurs in a bn_fix_top(), we examine the code in question; if + * the use of bn_fix_top() was appropriate (ie. it follows directly after code + * that manipulates the bignum) it is converted to bn_correct_top(), and if it + * was not appropriate, we convert it permanently to bn_check_top() and track + * down the cause of the bug. Eventually, no internal code should be using the + * bn_fix_top() macro. External applications and libraries should try this with + * their own code too, both in terms of building against the openssl headers + * with BN_DEBUG defined *and* linking with a version of OpenSSL built with it + * defined. This not only improves external code, it provides more test + * coverage for openssl's own code. + */ + +#ifdef BN_DEBUG + +/* We only need assert() when debugging */ +#include + +#ifdef BN_DEBUG_RAND +/* To avoid "make update" cvs wars due to BN_DEBUG, use some tricks */ +#ifndef RAND_pseudo_bytes +int RAND_pseudo_bytes(unsigned char *buf,int num); +#define BN_DEBUG_TRIX +#endif +#define bn_pollute(a) \ + do { \ + const BIGNUM *_bnum1 = (a); \ + if(_bnum1->top < _bnum1->dmax) { \ + unsigned char _tmp_char; \ + /* We cast away const without the compiler knowing, any \ + * *genuinely* constant variables that aren't mutable \ + * wouldn't be constructed with top!=dmax. */ \ + BN_ULONG *_not_const; \ + memcpy(&_not_const, &_bnum1->d, sizeof(BN_ULONG*)); \ + RAND_pseudo_bytes(&_tmp_char, 1); \ + memset((unsigned char *)(_not_const + _bnum1->top), _tmp_char, \ + (_bnum1->dmax - _bnum1->top) * sizeof(BN_ULONG)); \ + } \ + } while(0) +#ifdef BN_DEBUG_TRIX +#undef RAND_pseudo_bytes +#endif +#else +#define bn_pollute(a) +#endif +#define bn_check_top(a) \ + do { \ + const BIGNUM *_bnum2 = (a); \ + if (_bnum2 != NULL) { \ + assert((_bnum2->top == 0) || \ + (_bnum2->d[_bnum2->top - 1] != 0)); \ + bn_pollute(_bnum2); \ + } \ + } while(0) + +#define bn_fix_top(a) bn_check_top(a) + +#else /* !BN_DEBUG */ + +#define bn_pollute(a) +#define bn_check_top(a) +#define bn_fix_top(a) bn_correct_top(a) + +#endif + +#define bn_correct_top(a) \ + { \ + BN_ULONG *ftl; \ + if ((a)->top > 0) \ + { \ + for (ftl= &((a)->d[(a)->top-1]); (a)->top > 0; (a)->top--) \ + if (*(ftl--)) break; \ + } \ + bn_pollute(a); \ + } + +BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w); +BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w); +void bn_sqr_words(BN_ULONG *rp, const BN_ULONG *ap, int num); +BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d); +BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int num); +BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int num); + +/* Primes from RFC 2409 */ +BIGNUM *get_rfc2409_prime_768(BIGNUM *bn); +BIGNUM *get_rfc2409_prime_1024(BIGNUM *bn); + +/* Primes from RFC 3526 */ +BIGNUM *get_rfc3526_prime_1536(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_2048(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_3072(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_4096(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_6144(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_8192(BIGNUM *bn); + +int BN_bntest_rand(BIGNUM *rnd, int bits, int top,int bottom); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BN_strings(void); + +/* Error codes for the BN functions. */ + +/* Function codes. */ +#define BN_F_BNRAND 127 +#define BN_F_BN_BLINDING_CONVERT_EX 100 +#define BN_F_BN_BLINDING_CREATE_PARAM 128 +#define BN_F_BN_BLINDING_INVERT_EX 101 +#define BN_F_BN_BLINDING_NEW 102 +#define BN_F_BN_BLINDING_UPDATE 103 +#define BN_F_BN_BN2DEC 104 +#define BN_F_BN_BN2HEX 105 +#define BN_F_BN_CTX_GET 116 +#define BN_F_BN_CTX_NEW 106 +#define BN_F_BN_CTX_START 129 +#define BN_F_BN_DIV 107 +#define BN_F_BN_DIV_NO_BRANCH 138 +#define BN_F_BN_DIV_RECP 130 +#define BN_F_BN_EXP 123 +#define BN_F_BN_EXPAND2 108 +#define BN_F_BN_EXPAND_INTERNAL 120 +#define BN_F_BN_GF2M_MOD 131 +#define BN_F_BN_GF2M_MOD_EXP 132 +#define BN_F_BN_GF2M_MOD_MUL 133 +#define BN_F_BN_GF2M_MOD_SOLVE_QUAD 134 +#define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 135 +#define BN_F_BN_GF2M_MOD_SQR 136 +#define BN_F_BN_GF2M_MOD_SQRT 137 +#define BN_F_BN_MOD_EXP2_MONT 118 +#define BN_F_BN_MOD_EXP_MONT 109 +#define BN_F_BN_MOD_EXP_MONT_CONSTTIME 124 +#define BN_F_BN_MOD_EXP_MONT_WORD 117 +#define BN_F_BN_MOD_EXP_RECP 125 +#define BN_F_BN_MOD_EXP_SIMPLE 126 +#define BN_F_BN_MOD_INVERSE 110 +#define BN_F_BN_MOD_INVERSE_NO_BRANCH 139 +#define BN_F_BN_MOD_LSHIFT_QUICK 119 +#define BN_F_BN_MOD_MUL_RECIPROCAL 111 +#define BN_F_BN_MOD_SQRT 121 +#define BN_F_BN_MPI2BN 112 +#define BN_F_BN_NEW 113 +#define BN_F_BN_RAND 114 +#define BN_F_BN_RAND_RANGE 122 +#define BN_F_BN_USUB 115 + +/* Reason codes. */ +#define BN_R_ARG2_LT_ARG3 100 +#define BN_R_BAD_RECIPROCAL 101 +#define BN_R_BIGNUM_TOO_LONG 114 +#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_INPUT_NOT_REDUCED 110 +#define BN_R_INVALID_LENGTH 106 +#define BN_R_INVALID_RANGE 115 +#define BN_R_NOT_A_SQUARE 111 +#define BN_R_NOT_INITIALIZED 107 +#define BN_R_NO_INVERSE 108 +#define BN_R_NO_SOLUTION 116 +#define BN_R_P_IS_NOT_PRIME 112 +#define BN_R_TOO_MANY_ITERATIONS 113 +#define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/buffer.h b/mswin32/OpenSSL/include/openssl/buffer.h new file mode 100755 index 000000000..1db960745 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/buffer.h @@ -0,0 +1,118 @@ +/* crypto/buffer/buffer.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.] + */ + +#ifndef HEADER_BUFFER_H +#define HEADER_BUFFER_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if !defined(NO_SYS_TYPES_H) +#include +#endif + +/* Already declared in ossl_typ.h */ +/* typedef struct buf_mem_st BUF_MEM; */ + +struct buf_mem_st + { + int length; /* current number of bytes */ + char *data; + int max; /* size of buffer */ + }; + +BUF_MEM *BUF_MEM_new(void); +void BUF_MEM_free(BUF_MEM *a); +int BUF_MEM_grow(BUF_MEM *str, int len); +int BUF_MEM_grow_clean(BUF_MEM *str, int len); +char * BUF_strdup(const char *str); +char * BUF_strndup(const char *str, size_t siz); +void * BUF_memdup(const void *data, size_t siz); + +/* safe string functions */ +size_t BUF_strlcpy(char *dst,const char *src,size_t siz); +size_t BUF_strlcat(char *dst,const char *src,size_t siz); + + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_BUF_strings(void); + +/* Error codes for the BUF functions. */ + +/* Function codes. */ +#define BUF_F_BUF_MEMDUP 103 +#define BUF_F_BUF_MEM_GROW 100 +#define BUF_F_BUF_MEM_GROW_CLEAN 105 +#define BUF_F_BUF_MEM_NEW 101 +#define BUF_F_BUF_STRDUP 102 +#define BUF_F_BUF_STRNDUP 104 + +/* Reason codes. */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/cast.h b/mswin32/OpenSSL/include/openssl/cast.h new file mode 100755 index 000000000..90b45b950 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/cast.h @@ -0,0 +1,105 @@ +/* crypto/cast/cast.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.] + */ + +#ifndef HEADER_CAST_H +#define HEADER_CAST_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef OPENSSL_NO_CAST +#error CAST is disabled. +#endif + +#define CAST_ENCRYPT 1 +#define CAST_DECRYPT 0 + +#define CAST_LONG unsigned long + +#define CAST_BLOCK 8 +#define CAST_KEY_LENGTH 16 + +typedef struct cast_key_st + { + CAST_LONG data[32]; + int short_key; /* Use reduced rounds for short key */ + } CAST_KEY; + + +void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); +void CAST_ecb_encrypt(const unsigned char *in,unsigned char *out,CAST_KEY *key, + int enc); +void CAST_encrypt(CAST_LONG *data,CAST_KEY *key); +void CAST_decrypt(CAST_LONG *data,CAST_KEY *key); +void CAST_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + CAST_KEY *ks, unsigned char *iv, int enc); +void CAST_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, CAST_KEY *schedule, unsigned char *ivec, + int *num, int enc); +void CAST_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, CAST_KEY *schedule, unsigned char *ivec, + int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/comp.h b/mswin32/OpenSSL/include/openssl/comp.h new file mode 100755 index 000000000..5d59354a5 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/comp.h @@ -0,0 +1,66 @@ + +#ifndef HEADER_COMP_H +#define HEADER_COMP_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct comp_ctx_st COMP_CTX; + +typedef struct comp_method_st + { + int type; /* NID for compression library */ + const char *name; /* A text string to identify the library */ + int (*init)(COMP_CTX *ctx); + void (*finish)(COMP_CTX *ctx); + int (*compress)(COMP_CTX *ctx, + unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + int (*expand)(COMP_CTX *ctx, + unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + /* The following two do NOTHING, but are kept for backward compatibility */ + long (*ctrl)(void); + long (*callback_ctrl)(void); + } COMP_METHOD; + +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 *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 ); +COMP_METHOD *COMP_zlib(void ); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_COMP_strings(void); + +/* Error codes for the COMP functions. */ + +/* Function codes. */ + +/* Reason codes. */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/conf.h b/mswin32/OpenSSL/include/openssl/conf.h new file mode 100755 index 000000000..8aa06bc5e --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/conf.h @@ -0,0 +1,254 @@ +/* crypto/conf/conf.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.] + */ + +#ifndef HEADER_CONF_H +#define HEADER_CONF_H + +#include +#include +#include +#include +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct + { + char *section; + char *name; + char *value; + } CONF_VALUE; + +DECLARE_STACK_OF(CONF_VALUE) +DECLARE_STACK_OF(CONF_MODULE) +DECLARE_STACK_OF(CONF_IMODULE) + +struct conf_st; +struct conf_method_st; +typedef struct conf_method_st CONF_METHOD; + +struct conf_method_st + { + const char *name; + CONF *(*create)(CONF_METHOD *meth); + int (*init)(CONF *conf); + int (*destroy)(CONF *conf); + int (*destroy_data)(CONF *conf); + int (*load_bio)(CONF *conf, BIO *bp, long *eline); + int (*dump)(const CONF *conf, BIO *bp); + int (*is_number)(const CONF *conf, char c); + int (*to_int)(const CONF *conf, char c); + int (*load)(CONF *conf, const char *name, long *eline); + }; + +/* Module definitions */ + +typedef struct conf_imodule_st CONF_IMODULE; +typedef struct conf_module_st CONF_MODULE; + +/* DSO module function typedefs */ +typedef int conf_init_func(CONF_IMODULE *md, const CONF *cnf); +typedef void conf_finish_func(CONF_IMODULE *md); + +#define CONF_MFLAGS_IGNORE_ERRORS 0x1 +#define CONF_MFLAGS_IGNORE_RETURN_CODES 0x2 +#define CONF_MFLAGS_SILENT 0x4 +#define CONF_MFLAGS_NO_DSO 0x8 +#define CONF_MFLAGS_IGNORE_MISSING_FILE 0x10 +#define CONF_MFLAGS_DEFAULT_SECTION 0x20 + +int CONF_set_default_method(CONF_METHOD *meth); +void CONF_set_nconf(CONF *conf,LHASH *hash); +LHASH *CONF_load(LHASH *conf,const char *file,long *eline); +#ifndef OPENSSL_NO_FP_API +LHASH *CONF_load_fp(LHASH *conf, FILE *fp,long *eline); +#endif +LHASH *CONF_load_bio(LHASH *conf, BIO *bp,long *eline); +STACK_OF(CONF_VALUE) *CONF_get_section(LHASH *conf,const char *section); +char *CONF_get_string(LHASH *conf,const char *group,const char *name); +long CONF_get_number(LHASH *conf,const char *group,const char *name); +void CONF_free(LHASH *conf); +int CONF_dump_fp(LHASH *conf, FILE *out); +int CONF_dump_bio(LHASH *conf, BIO *out); + +void OPENSSL_config(const char *config_name); +void OPENSSL_no_config(void); + +/* New conf code. The semantics are different from the functions above. + If that wasn't the case, the above functions would have been replaced */ + +struct conf_st + { + CONF_METHOD *meth; + void *meth_data; + LHASH *data; + }; + +CONF *NCONF_new(CONF_METHOD *meth); +CONF_METHOD *NCONF_default(void); +CONF_METHOD *NCONF_WIN32(void); +#if 0 /* Just to give you an idea of what I have in mind */ +CONF_METHOD *NCONF_XML(void); +#endif +void NCONF_free(CONF *conf); +void NCONF_free_data(CONF *conf); + +int NCONF_load(CONF *conf,const char *file,long *eline); +#ifndef OPENSSL_NO_FP_API +int NCONF_load_fp(CONF *conf, FILE *fp,long *eline); +#endif +int NCONF_load_bio(CONF *conf, BIO *bp,long *eline); +STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf,const char *section); +char *NCONF_get_string(const CONF *conf,const char *group,const char *name); +int NCONF_get_number_e(const CONF *conf,const char *group,const char *name, + long *result); +int NCONF_dump_fp(const CONF *conf, FILE *out); +int NCONF_dump_bio(const CONF *conf, BIO *out); + +#if 0 /* The following function has no error checking, + and should therefore be avoided */ +long NCONF_get_number(CONF *conf,char *group,char *name); +#else +#define NCONF_get_number(c,g,n,r) NCONF_get_number_e(c,g,n,r) +#endif + +/* Module functions */ + +int CONF_modules_load(const CONF *cnf, const char *appname, + unsigned long flags); +int CONF_modules_load_file(const char *filename, const char *appname, + unsigned long flags); +void CONF_modules_unload(int all); +void CONF_modules_finish(void); +void CONF_modules_free(void); +int CONF_module_add(const char *name, conf_init_func *ifunc, + conf_finish_func *ffunc); + +const char *CONF_imodule_get_name(const CONF_IMODULE *md); +const char *CONF_imodule_get_value(const CONF_IMODULE *md); +void *CONF_imodule_get_usr_data(const CONF_IMODULE *md); +void CONF_imodule_set_usr_data(CONF_IMODULE *md, void *usr_data); +CONF_MODULE *CONF_imodule_get_module(const CONF_IMODULE *md); +unsigned long CONF_imodule_get_flags(const CONF_IMODULE *md); +void CONF_imodule_set_flags(CONF_IMODULE *md, unsigned long flags); +void *CONF_module_get_usr_data(CONF_MODULE *pmod); +void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data); + +char *CONF_get1_default_config_file(void); + +int CONF_parse_list(const char *list, int sep, int nospc, + int (*list_cb)(const char *elem, int len, void *usr), void *arg); + +void OPENSSL_load_builtin_modules(void); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CONF_strings(void); + +/* Error codes for the CONF functions. */ + +/* Function codes. */ +#define CONF_F_CONF_DUMP_FP 104 +#define CONF_F_CONF_LOAD 100 +#define CONF_F_CONF_LOAD_BIO 102 +#define CONF_F_CONF_LOAD_FP 103 +#define CONF_F_CONF_MODULES_LOAD 116 +#define CONF_F_DEF_LOAD 120 +#define CONF_F_DEF_LOAD_BIO 121 +#define CONF_F_MODULE_INIT 115 +#define CONF_F_MODULE_LOAD_DSO 117 +#define CONF_F_MODULE_RUN 118 +#define CONF_F_NCONF_DUMP_BIO 105 +#define CONF_F_NCONF_DUMP_FP 106 +#define CONF_F_NCONF_GET_NUMBER 107 +#define CONF_F_NCONF_GET_NUMBER_E 112 +#define CONF_F_NCONF_GET_SECTION 108 +#define CONF_F_NCONF_GET_STRING 109 +#define CONF_F_NCONF_LOAD 113 +#define CONF_F_NCONF_LOAD_BIO 110 +#define CONF_F_NCONF_LOAD_FP 114 +#define CONF_F_NCONF_NEW 111 +#define CONF_F_STR_COPY 101 + +/* Reason codes. */ +#define CONF_R_ERROR_LOADING_DSO 110 +#define CONF_R_MISSING_CLOSE_SQUARE_BRACKET 100 +#define CONF_R_MISSING_EQUAL_SIGN 101 +#define CONF_R_MISSING_FINISH_FUNCTION 111 +#define CONF_R_MISSING_INIT_FUNCTION 112 +#define CONF_R_MODULE_INITIALIZATION_ERROR 109 +#define CONF_R_NO_CLOSE_BRACE 102 +#define CONF_R_NO_CONF 105 +#define CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE 106 +#define CONF_R_NO_SECTION 107 +#define CONF_R_NO_SUCH_FILE 114 +#define CONF_R_NO_VALUE 108 +#define CONF_R_UNABLE_TO_CREATE_NEW_SECTION 103 +#define CONF_R_UNKNOWN_MODULE_NAME 113 +#define CONF_R_VARIABLE_HAS_NO_VALUE 104 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/conf_api.h b/mswin32/OpenSSL/include/openssl/conf_api.h new file mode 100755 index 000000000..87a954aff --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/conf_api.h @@ -0,0 +1,89 @@ +/* conf_api.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.] + */ + +#ifndef HEADER_CONF_API_H +#define HEADER_CONF_API_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Up until OpenSSL 0.9.5a, this was new_section */ +CONF_VALUE *_CONF_new_section(CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was get_section */ +CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was CONF_get_section */ +STACK_OF(CONF_VALUE) *_CONF_get_section_values(const CONF *conf, + const char *section); + +int _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value); +char *_CONF_get_string(const CONF *conf, const char *section, + const char *name); +long _CONF_get_number(const CONF *conf, const char *section, const char *name); + +int _CONF_new_data(CONF *conf); +void _CONF_free_data(CONF *conf); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/mswin32/OpenSSL/include/openssl/crypto.h b/mswin32/OpenSSL/include/openssl/crypto.h new file mode 100755 index 000000000..d2b5ffe33 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/crypto.h @@ -0,0 +1,550 @@ +/* crypto/crypto.h */ +/* ==================================================================== + * Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* 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.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_CRYPTO_H +#define HEADER_CRYPTO_H + +#include + +#include + +#ifndef OPENSSL_NO_FP_API +#include +#endif + +#include +#include +#include +#include + +#ifdef CHARSET_EBCDIC +#include +#endif + +/* Resolve problems on some operating systems with symbol names that clash + one way or another */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Backward compatibility to SSLeay */ +/* This is more to be used to check the correct DLL is being used + * in the MS world. */ +#define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +#define SSLEAY_VERSION 0 +/* #define SSLEAY_OPTIONS 1 no longer supported */ +#define SSLEAY_CFLAGS 2 +#define SSLEAY_BUILT_ON 3 +#define SSLEAY_PLATFORM 4 +#define SSLEAY_DIR 5 + +/* Already declared in ossl_typ.h */ +#if 0 +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; +/* Called when a new object is created */ +typedef int CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when an object is free()ed */ +typedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when we need to dup an object */ +typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, void *from_d, + int idx, long argl, void *argp); +#endif + +/* A generic structure to pass assorted data in a expandable way */ +typedef struct openssl_item_st + { + int code; + void *value; /* Not used for flag attributes */ + size_t value_size; /* Max size of value for output, length for input */ + size_t *value_length; /* Returned length of value for output */ + } OPENSSL_ITEM; + + +/* When changing the CRYPTO_LOCK_* list, be sure to maintin the text lock + * names in cryptlib.c + */ + +#define CRYPTO_LOCK_ERR 1 +#define CRYPTO_LOCK_EX_DATA 2 +#define CRYPTO_LOCK_X509 3 +#define CRYPTO_LOCK_X509_INFO 4 +#define CRYPTO_LOCK_X509_PKEY 5 +#define CRYPTO_LOCK_X509_CRL 6 +#define CRYPTO_LOCK_X509_REQ 7 +#define CRYPTO_LOCK_DSA 8 +#define CRYPTO_LOCK_RSA 9 +#define CRYPTO_LOCK_EVP_PKEY 10 +#define CRYPTO_LOCK_X509_STORE 11 +#define CRYPTO_LOCK_SSL_CTX 12 +#define CRYPTO_LOCK_SSL_CERT 13 +#define CRYPTO_LOCK_SSL_SESSION 14 +#define CRYPTO_LOCK_SSL_SESS_CERT 15 +#define CRYPTO_LOCK_SSL 16 +#define CRYPTO_LOCK_SSL_METHOD 17 +#define CRYPTO_LOCK_RAND 18 +#define CRYPTO_LOCK_RAND2 19 +#define CRYPTO_LOCK_MALLOC 20 +#define CRYPTO_LOCK_BIO 21 +#define CRYPTO_LOCK_GETHOSTBYNAME 22 +#define CRYPTO_LOCK_GETSERVBYNAME 23 +#define CRYPTO_LOCK_READDIR 24 +#define CRYPTO_LOCK_RSA_BLINDING 25 +#define CRYPTO_LOCK_DH 26 +#define CRYPTO_LOCK_MALLOC2 27 +#define CRYPTO_LOCK_DSO 28 +#define CRYPTO_LOCK_DYNLOCK 29 +#define CRYPTO_LOCK_ENGINE 30 +#define CRYPTO_LOCK_UI 31 +#define CRYPTO_LOCK_ECDSA 32 +#define CRYPTO_LOCK_EC 33 +#define CRYPTO_LOCK_ECDH 34 +#define CRYPTO_LOCK_BN 35 +#define CRYPTO_LOCK_EC_PRE_COMP 36 +#define CRYPTO_LOCK_STORE 37 +#define CRYPTO_LOCK_COMP 38 +#define CRYPTO_NUM_LOCKS 39 + +#define CRYPTO_LOCK 1 +#define CRYPTO_UNLOCK 2 +#define CRYPTO_READ 4 +#define CRYPTO_WRITE 8 + +#ifndef OPENSSL_NO_LOCKING +#ifndef CRYPTO_w_lock +#define CRYPTO_w_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +#define CRYPTO_w_unlock(type) \ + CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +#define CRYPTO_r_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__) +#define CRYPTO_r_unlock(type) \ + 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 + +/* Some applications as well as some parts of OpenSSL need to allocate + and deallocate locks in a dynamic fashion. The following typedef + makes this possible in a type-safe manner. */ +/* struct CRYPTO_dynlock_value has to be defined by the application. */ +typedef struct + { + int references; + struct CRYPTO_dynlock_value *data; + } CRYPTO_dynlock; + + +/* 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 /* 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 */ + +/* The following are bit values to turn on or off options connected to the + * malloc checking functionality */ + +/* Adds time to the memory checking information */ +#define V_CRYPTO_MDEBUG_TIME 0x1 /* a bit */ +/* Adds thread number to the memory checking information */ +#define V_CRYPTO_MDEBUG_THREAD 0x2 /* a bit */ + +#define V_CRYPTO_MDEBUG_ALL (V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD) + + +/* predec of the BIO type */ +typedef struct bio_st BIO_dummy; + +struct crypto_ex_data_st + { + STACK *sk; + int dummy; /* gcc is screwing up this data structure :-( */ + }; + +/* This stuff is basically class callback functions + * The current classes are SSL_CTX, SSL, SSL_SESSION, and a few more */ + +typedef struct crypto_ex_data_func_st + { + long argl; /* Arbitary long */ + void *argp; /* Arbitary void * */ + CRYPTO_EX_new *new_func; + CRYPTO_EX_free *free_func; + CRYPTO_EX_dup *dup_func; + } CRYPTO_EX_DATA_FUNCS; + +DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS) + +/* Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA + * entry. + */ + +#define CRYPTO_EX_INDEX_BIO 0 +#define CRYPTO_EX_INDEX_SSL 1 +#define CRYPTO_EX_INDEX_SSL_CTX 2 +#define CRYPTO_EX_INDEX_SSL_SESSION 3 +#define CRYPTO_EX_INDEX_X509_STORE 4 +#define CRYPTO_EX_INDEX_X509_STORE_CTX 5 +#define CRYPTO_EX_INDEX_RSA 6 +#define CRYPTO_EX_INDEX_DSA 7 +#define CRYPTO_EX_INDEX_DH 8 +#define CRYPTO_EX_INDEX_ENGINE 9 +#define CRYPTO_EX_INDEX_X509 10 +#define CRYPTO_EX_INDEX_UI 11 +#define CRYPTO_EX_INDEX_ECDSA 12 +#define CRYPTO_EX_INDEX_ECDH 13 +#define CRYPTO_EX_INDEX_COMP 14 +#define CRYPTO_EX_INDEX_STORE 15 + +/* Dynamically assigned indexes start from this value (don't use directly, use + * via CRYPTO_ex_data_new_class). */ +#define CRYPTO_EX_INDEX_USER 100 + + +/* This is the default callbacks, but we can have others as well: + * this is needed in Win32 where the application malloc and the + * library malloc may not be the same. + */ +#define CRYPTO_malloc_init() CRYPTO_set_mem_functions(\ + malloc, realloc, free) + +#if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD +# ifndef CRYPTO_MDEBUG /* avoid duplicate #define */ +# define CRYPTO_MDEBUG +# endif +#endif + +/* Set standard debugging functions (not done by default + * unless CRYPTO_MDEBUG is defined) */ +#define CRYPTO_malloc_debug_init() do {\ + CRYPTO_set_mem_debug_functions(\ + CRYPTO_dbg_malloc,\ + CRYPTO_dbg_realloc,\ + CRYPTO_dbg_free,\ + CRYPTO_dbg_set_options,\ + CRYPTO_dbg_get_options);\ + } while(0) + +int CRYPTO_mem_ctrl(int mode); +int CRYPTO_is_mem_check_on(void); + +/* for applications */ +#define MemCheck_start() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON) +#define MemCheck_stop() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF) + +/* for library-internal use */ +#define MemCheck_on() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE) +#define MemCheck_off() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE) +#define is_MemCheck_on() CRYPTO_is_mem_check_on() + +#define OPENSSL_malloc(num) CRYPTO_malloc((int)num,__FILE__,__LINE__) +#define OPENSSL_realloc(addr,num) \ + CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__) +#define OPENSSL_realloc_clean(addr,old_num,num) \ + CRYPTO_realloc_clean(addr,old_num,num,__FILE__,__LINE__) +#define OPENSSL_remalloc(addr,num) \ + CRYPTO_remalloc((char **)addr,(int)num,__FILE__,__LINE__) +#define OPENSSL_freeFunc CRYPTO_free +#define OPENSSL_free(addr) CRYPTO_free(addr) + +#define OPENSSL_malloc_locked(num) \ + CRYPTO_malloc_locked((int)num,__FILE__,__LINE__) +#define OPENSSL_free_locked(addr) CRYPTO_free_locked(addr) + + +const char *SSLeay_version(int type); +unsigned long SSLeay(void); + +int OPENSSL_issetugid(void); + +/* An opaque type representing an implementation of "ex_data" support */ +typedef struct st_CRYPTO_EX_DATA_IMPL CRYPTO_EX_DATA_IMPL; +/* Return an opaque pointer to the current "ex_data" implementation */ +const CRYPTO_EX_DATA_IMPL *CRYPTO_get_ex_data_implementation(void); +/* Sets the "ex_data" implementation to be used (if it's not too late) */ +int CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i); +/* Get a new "ex_data" class, and return the corresponding "class_index" */ +int CRYPTO_ex_data_new_class(void); +/* Within a given class, get/register a new index */ +int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, + CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +/* Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a given + * class (invokes whatever per-class callbacks are applicable) */ +int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, + CRYPTO_EX_DATA *from); +void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +/* Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular index + * (relative to the class type involved) */ +int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); +void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad,int idx); +/* This function cleans up all "ex_data" state. It mustn't be called under + * potential race-conditions. */ +void CRYPTO_cleanup_all_ex_data(void); + +int CRYPTO_get_new_lockid(char *name); + +int CRYPTO_num_locks(void); /* return CRYPTO_NUM_LOCKS (shared libs!) */ +void CRYPTO_lock(int mode, int type,const char *file,int line); +void CRYPTO_set_locking_callback(void (*func)(int mode,int type, + const char *file,int line)); +void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file, + int line); +void CRYPTO_set_add_lock_callback(int (*func)(int *num,int mount,int type, + const char *file, int line)); +int (*CRYPTO_get_add_lock_callback(void))(int *num,int mount,int type, + const char *file,int line); +void CRYPTO_set_id_callback(unsigned long (*func)(void)); +unsigned long (*CRYPTO_get_id_callback(void))(void); +unsigned long CRYPTO_thread_id(void); +const char *CRYPTO_get_lock_name(int type); +int CRYPTO_add_lock(int *pointer,int amount,int type, const char *file, + int line); + +int CRYPTO_get_new_dynlockid(void); +void CRYPTO_destroy_dynlockid(int i); +struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i); +void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*dyn_create_function)(const char *file, int line)); +void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function)(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)); +void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)(struct CRYPTO_dynlock_value *l, const char *file, int line)); +struct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void))(const char *file,int line); +void (*CRYPTO_get_dynlock_lock_callback(void))(int mode, struct CRYPTO_dynlock_value *l, const char *file,int line); +void (*CRYPTO_get_dynlock_destroy_callback(void))(struct CRYPTO_dynlock_value *l, const char *file,int line); + +/* CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions -- + * call the latter last if you need different functions */ +int CRYPTO_set_mem_functions(void *(*m)(size_t),void *(*r)(void *,size_t), void (*f)(void *)); +int CRYPTO_set_locked_mem_functions(void *(*m)(size_t), void (*free_func)(void *)); +int CRYPTO_set_mem_ex_functions(void *(*m)(size_t,const char *,int), + void *(*r)(void *,size_t,const char *,int), + void (*f)(void *)); +int CRYPTO_set_locked_mem_ex_functions(void *(*m)(size_t,const char *,int), + void (*free_func)(void *)); +int CRYPTO_set_mem_debug_functions(void (*m)(void *,int,const char *,int,int), + void (*r)(void *,void *,int,const char *,int,int), + void (*f)(void *,int), + void (*so)(long), + long (*go)(void)); +void CRYPTO_get_mem_functions(void *(**m)(size_t),void *(**r)(void *, size_t), void (**f)(void *)); +void CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *)); +void CRYPTO_get_mem_ex_functions(void *(**m)(size_t,const char *,int), + void *(**r)(void *, size_t,const char *,int), + void (**f)(void *)); +void CRYPTO_get_locked_mem_ex_functions(void *(**m)(size_t,const char *,int), + void (**f)(void *)); +void CRYPTO_get_mem_debug_functions(void (**m)(void *,int,const char *,int,int), + void (**r)(void *,void *,int,const char *,int,int), + void (**f)(void *,int), + void (**so)(long), + long (**go)(void)); + +void *CRYPTO_malloc_locked(int num, const char *file, int line); +void CRYPTO_free_locked(void *); +void *CRYPTO_malloc(int num, const char *file, int line); +void CRYPTO_free(void *); +void *CRYPTO_realloc(void *addr,int num, const char *file, int line); +void *CRYPTO_realloc_clean(void *addr,int old_num,int num,const char *file, + int line); +void *CRYPTO_remalloc(void *addr,int num, const char *file, int line); + +void OPENSSL_cleanse(void *ptr, size_t len); + +void CRYPTO_set_mem_debug_options(long bits); +long CRYPTO_get_mem_debug_options(void); + +#define CRYPTO_push_info(info) \ + CRYPTO_push_info_(info, __FILE__, __LINE__); +int CRYPTO_push_info_(const char *info, const char *file, int line); +int CRYPTO_pop_info(void); +int CRYPTO_remove_all_info(void); + + +/* Default debugging functions (enabled by CRYPTO_malloc_debug_init() macro; + * used as default in CRYPTO_MDEBUG compilations): */ +/* The last argument has the following significance: + * + * 0: called before the actual memory allocation has taken place + * 1: called after the actual memory allocation has taken place + */ +void CRYPTO_dbg_malloc(void *addr,int num,const char *file,int line,int before_p); +void CRYPTO_dbg_realloc(void *addr1,void *addr2,int num,const char *file,int line,int before_p); +void CRYPTO_dbg_free(void *addr,int before_p); +/* Tell the debugging code about options. By default, the following values + * apply: + * + * 0: Clear all options. + * V_CRYPTO_MDEBUG_TIME (1): Set the "Show Time" option. + * V_CRYPTO_MDEBUG_THREAD (2): Set the "Show Thread Number" option. + * V_CRYPTO_MDEBUG_ALL (3): 1 + 2 + */ +void CRYPTO_dbg_set_options(long bits); +long CRYPTO_dbg_get_options(void); + + +#ifndef OPENSSL_NO_FP_API +void CRYPTO_mem_leaks_fp(FILE *); +#endif +void CRYPTO_mem_leaks(struct bio_st *bio); +/* unsigned long order, char *file, int line, int num_bytes, char *addr */ +typedef void *CRYPTO_MEM_LEAK_CB(unsigned long, const char *, int, int, void *); +void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb); + +/* die if we have to */ +void OpenSSLDie(const char *file,int line,const char *assertion); +#define OPENSSL_assert(e) (void)((e) ? 0 : (OpenSSLDie(__FILE__, __LINE__, #e),1)) + +unsigned long *OPENSSL_ia32cap_loc(void); +#define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc())) + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_CRYPTO_strings(void); + +/* Error codes for the CRYPTO functions. */ + +/* Function codes. */ +#define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX 100 +#define CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID 103 +#define CRYPTO_F_CRYPTO_GET_NEW_LOCKID 101 +#define CRYPTO_F_CRYPTO_SET_EX_DATA 102 +#define CRYPTO_F_DEF_ADD_INDEX 104 +#define CRYPTO_F_DEF_GET_CLASS 105 +#define CRYPTO_F_INT_DUP_EX_DATA 106 +#define CRYPTO_F_INT_FREE_EX_DATA 107 +#define CRYPTO_F_INT_NEW_EX_DATA 108 + +/* Reason codes. */ +#define CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/des.h b/mswin32/OpenSSL/include/openssl/des.h new file mode 100755 index 000000000..3cbc2b568 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/des.h @@ -0,0 +1,244 @@ +/* crypto/des/des.h */ +/* 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.] + */ + +#ifndef HEADER_NEW_DES_H +#define HEADER_NEW_DES_H + +#include /* OPENSSL_EXTERN, OPENSSL_NO_DES, + DES_LONG (via openssl/opensslconf.h */ + +#ifdef OPENSSL_NO_DES +#error DES is disabled. +#endif + +#ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char DES_cblock[8]; +typedef /* const */ unsigned char const_DES_cblock[8]; +/* With "const", gcc 2.8.1 on Solaris thinks that DES_cblock * + * and const_DES_cblock * are incompatible pointer types. */ + +typedef struct DES_ks + { + union + { + DES_cblock cblock; + /* make sure things are correct size on machines with + * 8 byte longs */ + DES_LONG deslong[2]; + } ks[16]; + } DES_key_schedule; + +#ifndef OPENSSL_DISABLE_OLD_DES_SUPPORT +# ifndef OPENSSL_ENABLE_OLD_DES_SUPPORT +# define OPENSSL_ENABLE_OLD_DES_SUPPORT +# endif +#endif + +#ifdef OPENSSL_ENABLE_OLD_DES_SUPPORT +# include +#endif + +#define DES_KEY_SZ (sizeof(DES_cblock)) +#define DES_SCHEDULE_SZ (sizeof(DES_key_schedule)) + +#define DES_ENCRYPT 1 +#define DES_DECRYPT 0 + +#define DES_CBC_MODE 0 +#define DES_PCBC_MODE 1 + +#define DES_ecb2_encrypt(i,o,k1,k2,e) \ + DES_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +#define DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +#define DES_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + DES_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +#define DES_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + DES_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +OPENSSL_DECLARE_GLOBAL(int,DES_check_key); /* defaults to false */ +#define DES_check_key OPENSSL_GLOBAL_REF(DES_check_key) +OPENSSL_DECLARE_GLOBAL(int,DES_rw_mode); /* defaults to DES_PCBC_MODE */ +#define DES_rw_mode OPENSSL_GLOBAL_REF(DES_rw_mode) + +const char *DES_options(void); +void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks1,DES_key_schedule *ks2, + DES_key_schedule *ks3, int enc); +DES_LONG DES_cbc_cksum(const unsigned char *input,DES_cblock *output, + long length,DES_key_schedule *schedule, + const_DES_cblock *ivec); +/* DES_cbc_encrypt does not update the IV! Use DES_ncbc_encrypt instead. */ +void DES_cbc_encrypt(const unsigned char *input,unsigned char *output, + long length,DES_key_schedule *schedule,DES_cblock *ivec, + int enc); +void DES_ncbc_encrypt(const unsigned char *input,unsigned char *output, + long length,DES_key_schedule *schedule,DES_cblock *ivec, + int enc); +void DES_xcbc_encrypt(const unsigned char *input,unsigned char *output, + long length,DES_key_schedule *schedule,DES_cblock *ivec, + const_DES_cblock *inw,const_DES_cblock *outw,int enc); +void DES_cfb_encrypt(const unsigned char *in,unsigned char *out,int numbits, + long length,DES_key_schedule *schedule,DES_cblock *ivec, + int enc); +void DES_ecb_encrypt(const_DES_cblock *input,DES_cblock *output, + DES_key_schedule *ks,int enc); + +/* This is the DES encryption function that gets called by just about + every other DES routine in the library. You should not use this + function except to implement 'modes' of DES. I say this because the + functions that call this routine do the conversion from 'char *' to + long, and this needs to be done to make sure 'non-aligned' memory + access do not occur. The characters are loaded 'little endian'. + Data is a pointer to 2 unsigned long's and ks is the + DES_key_schedule to use. enc, is non zero specifies encryption, + zero if decryption. */ +void DES_encrypt1(DES_LONG *data,DES_key_schedule *ks, int enc); + +/* This functions is the same as DES_encrypt1() except that the DES + initial permutation (IP) and final permutation (FP) have been left + out. As for DES_encrypt1(), you should not use this function. + It is used by the routines in the library that implement triple DES. + IP() DES_encrypt2() DES_encrypt2() DES_encrypt2() FP() is the same + as DES_encrypt1() DES_encrypt1() DES_encrypt1() except faster :-). */ +void DES_encrypt2(DES_LONG *data,DES_key_schedule *ks, int enc); + +void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_ede3_cbc_encrypt(const unsigned char *input,unsigned char *output, + long length, + DES_key_schedule *ks1,DES_key_schedule *ks2, + DES_key_schedule *ks3,DES_cblock *ivec,int enc); +void DES_ede3_cbcm_encrypt(const unsigned char *in,unsigned char *out, + long length, + DES_key_schedule *ks1,DES_key_schedule *ks2, + DES_key_schedule *ks3, + DES_cblock *ivec1,DES_cblock *ivec2, + int enc); +void DES_ede3_cfb64_encrypt(const unsigned char *in,unsigned char *out, + long length,DES_key_schedule *ks1, + DES_key_schedule *ks2,DES_key_schedule *ks3, + DES_cblock *ivec,int *num,int enc); +void DES_ede3_cfb_encrypt(const unsigned char *in,unsigned char *out, + int numbits,long length,DES_key_schedule *ks1, + DES_key_schedule *ks2,DES_key_schedule *ks3, + DES_cblock *ivec,int enc); +void DES_ede3_ofb64_encrypt(const unsigned char *in,unsigned char *out, + long length,DES_key_schedule *ks1, + DES_key_schedule *ks2,DES_key_schedule *ks3, + DES_cblock *ivec,int *num); + +void DES_xwhite_in2out(const_DES_cblock *DES_key,const_DES_cblock *in_white, + DES_cblock *out_white); + +int DES_enc_read(int fd,void *buf,int len,DES_key_schedule *sched, + DES_cblock *iv); +int DES_enc_write(int fd,const void *buf,int len,DES_key_schedule *sched, + DES_cblock *iv); +char *DES_fcrypt(const char *buf,const char *salt, char *ret); +char *DES_crypt(const char *buf,const char *salt); +void DES_ofb_encrypt(const unsigned char *in,unsigned char *out,int numbits, + long length,DES_key_schedule *schedule,DES_cblock *ivec); +void DES_pcbc_encrypt(const unsigned char *input,unsigned char *output, + long length,DES_key_schedule *schedule,DES_cblock *ivec, + int enc); +DES_LONG DES_quad_cksum(const unsigned char *input,DES_cblock output[], + long length,int out_count,DES_cblock *seed); +int DES_random_key(DES_cblock *ret); +void DES_set_odd_parity(DES_cblock *key); +int DES_check_key_parity(const_DES_cblock *key); +int DES_is_weak_key(const_DES_cblock *key); +/* DES_set_key (= set_key = DES_key_sched = key_sched) calls + * DES_set_key_checked if global variable DES_check_key is set, + * DES_set_key_unchecked otherwise. */ +int DES_set_key(const_DES_cblock *key,DES_key_schedule *schedule); +int DES_key_sched(const_DES_cblock *key,DES_key_schedule *schedule); +int DES_set_key_checked(const_DES_cblock *key,DES_key_schedule *schedule); +void DES_set_key_unchecked(const_DES_cblock *key,DES_key_schedule *schedule); +void DES_string_to_key(const char *str,DES_cblock *key); +void DES_string_to_2keys(const char *str,DES_cblock *key1,DES_cblock *key2); +void DES_cfb64_encrypt(const unsigned char *in,unsigned char *out,long length, + DES_key_schedule *schedule,DES_cblock *ivec,int *num, + int enc); +void DES_ofb64_encrypt(const unsigned char *in,unsigned char *out,long length, + DES_key_schedule *schedule,DES_cblock *ivec,int *num); + +int DES_read_password(DES_cblock *key, const char *prompt, int verify); +int DES_read_2passwords(DES_cblock *key1, DES_cblock *key2, const char *prompt, + int verify); + +#define DES_fixup_key_parity DES_set_odd_parity + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/des_old.h b/mswin32/OpenSSL/include/openssl/des_old.h new file mode 100755 index 000000000..1b0620c3a --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/des_old.h @@ -0,0 +1,445 @@ +/* crypto/des/des_old.h -*- mode:C; c-file-style: "eay" -*- */ + +/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + * + * The function names in here are deprecated and are only present to + * provide an interface compatible with openssl 0.9.6 and older as + * well as libdes. OpenSSL now provides functions where "des_" has + * been replaced with "DES_" in the names, to make it possible to + * make incompatible changes that are needed for C type security and + * other stuff. + * + * This include files has two compatibility modes: + * + * - If OPENSSL_DES_LIBDES_COMPATIBILITY is defined, you get an API + * that is compatible with libdes and SSLeay. + * - If OPENSSL_DES_LIBDES_COMPATIBILITY isn't defined, you get an + * API that is compatible with OpenSSL 0.9.5x to 0.9.6x. + * + * Note that these modes break earlier snapshots of OpenSSL, where + * libdes compatibility was the only available mode or (later on) the + * prefered compatibility mode. However, after much consideration + * (and more or less violent discussions with external parties), it + * was concluded that OpenSSL should be compatible with earlier versions + * of itself before anything else. Also, in all honesty, libdes is + * an old beast that shouldn't really be used any more. + * + * Please consider starting to use the DES_ functions rather than the + * des_ ones. The des_ functions will disappear completely before + * OpenSSL 1.0! + * + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + */ + +/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL + * project 2001. + */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DES_H +#define HEADER_DES_H + +#include /* OPENSSL_EXTERN, OPENSSL_NO_DES, DES_LONG */ + +#ifdef OPENSSL_NO_DES +#error DES is disabled. +#endif + +#ifndef HEADER_NEW_DES_H +#error You must include des.h, not des_old.h directly. +#endif + +#ifdef _KERBEROS_DES_H +#error replaces . +#endif + +#include + +#ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _ +#undef _ +#endif + +typedef unsigned char _ossl_old_des_cblock[8]; +typedef struct _ossl_old_des_ks_struct + { + union { + _ossl_old_des_cblock _; + /* make sure things are correct size on machines with + * 8 byte longs */ + DES_LONG pad[2]; + } ks; + } _ossl_old_des_key_schedule[16]; + +#ifndef OPENSSL_DES_LIBDES_COMPATIBILITY +#define des_cblock DES_cblock +#define const_des_cblock const_DES_cblock +#define des_key_schedule DES_key_schedule +#define des_ecb3_encrypt(i,o,k1,k2,k3,e)\ + DES_ecb3_encrypt((i),(o),&(k1),&(k2),&(k3),(e)) +#define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\ + DES_ede3_cbc_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(e)) +#define des_ede3_cbcm_encrypt(i,o,l,k1,k2,k3,iv1,iv2,e)\ + DES_ede3_cbcm_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv1),(iv2),(e)) +#define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\ + DES_ede3_cfb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n),(e)) +#define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\ + DES_ede3_ofb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n)) +#define des_options()\ + DES_options() +#define des_cbc_cksum(i,o,l,k,iv)\ + DES_cbc_cksum((i),(o),(l),&(k),(iv)) +#define des_cbc_encrypt(i,o,l,k,iv,e)\ + DES_cbc_encrypt((i),(o),(l),&(k),(iv),(e)) +#define des_ncbc_encrypt(i,o,l,k,iv,e)\ + DES_ncbc_encrypt((i),(o),(l),&(k),(iv),(e)) +#define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\ + DES_xcbc_encrypt((i),(o),(l),&(k),(iv),(inw),(outw),(e)) +#define des_cfb_encrypt(i,o,n,l,k,iv,e)\ + DES_cfb_encrypt((i),(o),(n),(l),&(k),(iv),(e)) +#define des_ecb_encrypt(i,o,k,e)\ + DES_ecb_encrypt((i),(o),&(k),(e)) +#define des_encrypt1(d,k,e)\ + DES_encrypt1((d),&(k),(e)) +#define des_encrypt2(d,k,e)\ + DES_encrypt2((d),&(k),(e)) +#define des_encrypt3(d,k1,k2,k3)\ + DES_encrypt3((d),&(k1),&(k2),&(k3)) +#define des_decrypt3(d,k1,k2,k3)\ + DES_decrypt3((d),&(k1),&(k2),&(k3)) +#define des_xwhite_in2out(k,i,o)\ + DES_xwhite_in2out((k),(i),(o)) +#define des_enc_read(f,b,l,k,iv)\ + DES_enc_read((f),(b),(l),&(k),(iv)) +#define des_enc_write(f,b,l,k,iv)\ + DES_enc_write((f),(b),(l),&(k),(iv)) +#define des_fcrypt(b,s,r)\ + DES_fcrypt((b),(s),(r)) +#if 0 +#define des_crypt(b,s)\ + DES_crypt((b),(s)) +#if !defined(PERL5) && !defined(__FreeBSD__) && !defined(NeXT) && !defined(__OpenBSD__) +#define crypt(b,s)\ + DES_crypt((b),(s)) +#endif +#endif +#define des_ofb_encrypt(i,o,n,l,k,iv)\ + DES_ofb_encrypt((i),(o),(n),(l),&(k),(iv)) +#define des_pcbc_encrypt(i,o,l,k,iv,e)\ + DES_pcbc_encrypt((i),(o),(l),&(k),(iv),(e)) +#define des_quad_cksum(i,o,l,c,s)\ + DES_quad_cksum((i),(o),(l),(c),(s)) +#define des_random_seed(k)\ + _ossl_096_des_random_seed((k)) +#define des_random_key(r)\ + DES_random_key((r)) +#define des_read_password(k,p,v) \ + DES_read_password((k),(p),(v)) +#define des_read_2passwords(k1,k2,p,v) \ + DES_read_2passwords((k1),(k2),(p),(v)) +#define des_set_odd_parity(k)\ + DES_set_odd_parity((k)) +#define des_check_key_parity(k)\ + DES_check_key_parity((k)) +#define des_is_weak_key(k)\ + DES_is_weak_key((k)) +#define des_set_key(k,ks)\ + DES_set_key((k),&(ks)) +#define des_key_sched(k,ks)\ + DES_key_sched((k),&(ks)) +#define des_set_key_checked(k,ks)\ + DES_set_key_checked((k),&(ks)) +#define des_set_key_unchecked(k,ks)\ + DES_set_key_unchecked((k),&(ks)) +#define des_string_to_key(s,k)\ + DES_string_to_key((s),(k)) +#define des_string_to_2keys(s,k1,k2)\ + DES_string_to_2keys((s),(k1),(k2)) +#define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\ + DES_cfb64_encrypt((i),(o),(l),&(ks),(iv),(n),(e)) +#define des_ofb64_encrypt(i,o,l,ks,iv,n)\ + DES_ofb64_encrypt((i),(o),(l),&(ks),(iv),(n)) + + +#define des_ecb2_encrypt(i,o,k1,k2,e) \ + des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +#define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +#define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +#define des_check_key DES_check_key +#define des_rw_mode DES_rw_mode +#else /* libdes compatibility */ +/* Map all symbol names to _ossl_old_des_* form, so we avoid all + clashes with libdes */ +#define des_cblock _ossl_old_des_cblock +#define des_key_schedule _ossl_old_des_key_schedule +#define des_ecb3_encrypt(i,o,k1,k2,k3,e)\ + _ossl_old_des_ecb3_encrypt((i),(o),(k1),(k2),(k3),(e)) +#define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\ + _ossl_old_des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(e)) +#define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\ + _ossl_old_des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n),(e)) +#define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\ + _ossl_old_des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n)) +#define des_options()\ + _ossl_old_des_options() +#define des_cbc_cksum(i,o,l,k,iv)\ + _ossl_old_des_cbc_cksum((i),(o),(l),(k),(iv)) +#define des_cbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_cbc_encrypt((i),(o),(l),(k),(iv),(e)) +#define des_ncbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_ncbc_encrypt((i),(o),(l),(k),(iv),(e)) +#define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\ + _ossl_old_des_xcbc_encrypt((i),(o),(l),(k),(iv),(inw),(outw),(e)) +#define des_cfb_encrypt(i,o,n,l,k,iv,e)\ + _ossl_old_des_cfb_encrypt((i),(o),(n),(l),(k),(iv),(e)) +#define des_ecb_encrypt(i,o,k,e)\ + _ossl_old_des_ecb_encrypt((i),(o),(k),(e)) +#define des_encrypt(d,k,e)\ + _ossl_old_des_encrypt((d),(k),(e)) +#define des_encrypt2(d,k,e)\ + _ossl_old_des_encrypt2((d),(k),(e)) +#define des_encrypt3(d,k1,k2,k3)\ + _ossl_old_des_encrypt3((d),(k1),(k2),(k3)) +#define des_decrypt3(d,k1,k2,k3)\ + _ossl_old_des_decrypt3((d),(k1),(k2),(k3)) +#define des_xwhite_in2out(k,i,o)\ + _ossl_old_des_xwhite_in2out((k),(i),(o)) +#define des_enc_read(f,b,l,k,iv)\ + _ossl_old_des_enc_read((f),(b),(l),(k),(iv)) +#define des_enc_write(f,b,l,k,iv)\ + _ossl_old_des_enc_write((f),(b),(l),(k),(iv)) +#define des_fcrypt(b,s,r)\ + _ossl_old_des_fcrypt((b),(s),(r)) +#define des_crypt(b,s)\ + _ossl_old_des_crypt((b),(s)) +#if 0 +#define crypt(b,s)\ + _ossl_old_crypt((b),(s)) +#endif +#define des_ofb_encrypt(i,o,n,l,k,iv)\ + _ossl_old_des_ofb_encrypt((i),(o),(n),(l),(k),(iv)) +#define des_pcbc_encrypt(i,o,l,k,iv,e)\ + _ossl_old_des_pcbc_encrypt((i),(o),(l),(k),(iv),(e)) +#define des_quad_cksum(i,o,l,c,s)\ + _ossl_old_des_quad_cksum((i),(o),(l),(c),(s)) +#define des_random_seed(k)\ + _ossl_old_des_random_seed((k)) +#define des_random_key(r)\ + _ossl_old_des_random_key((r)) +#define des_read_password(k,p,v) \ + _ossl_old_des_read_password((k),(p),(v)) +#define des_read_2passwords(k1,k2,p,v) \ + _ossl_old_des_read_2passwords((k1),(k2),(p),(v)) +#define des_set_odd_parity(k)\ + _ossl_old_des_set_odd_parity((k)) +#define des_is_weak_key(k)\ + _ossl_old_des_is_weak_key((k)) +#define des_set_key(k,ks)\ + _ossl_old_des_set_key((k),(ks)) +#define des_key_sched(k,ks)\ + _ossl_old_des_key_sched((k),(ks)) +#define des_string_to_key(s,k)\ + _ossl_old_des_string_to_key((s),(k)) +#define des_string_to_2keys(s,k1,k2)\ + _ossl_old_des_string_to_2keys((s),(k1),(k2)) +#define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\ + _ossl_old_des_cfb64_encrypt((i),(o),(l),(ks),(iv),(n),(e)) +#define des_ofb64_encrypt(i,o,l,ks,iv,n)\ + _ossl_old_des_ofb64_encrypt((i),(o),(l),(ks),(iv),(n)) + + +#define des_ecb2_encrypt(i,o,k1,k2,e) \ + des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +#define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +#define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +#define des_check_key DES_check_key +#define des_rw_mode DES_rw_mode +#endif + +const char *_ossl_old_des_options(void); +void _ossl_old_des_ecb3_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output, + _ossl_old_des_key_schedule ks1,_ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, int enc); +DES_LONG _ossl_old_des_cbc_cksum(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output, + long length,_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec); +void _ossl_old_des_cbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length, + _ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc); +void _ossl_old_des_ncbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length, + _ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc); +void _ossl_old_des_xcbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length, + _ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec, + _ossl_old_des_cblock *inw,_ossl_old_des_cblock *outw,int enc); +void _ossl_old_des_cfb_encrypt(unsigned char *in,unsigned char *out,int numbits, + long length,_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc); +void _ossl_old_des_ecb_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output, + _ossl_old_des_key_schedule ks,int enc); +void _ossl_old_des_encrypt(DES_LONG *data,_ossl_old_des_key_schedule ks, int enc); +void _ossl_old_des_encrypt2(DES_LONG *data,_ossl_old_des_key_schedule ks, int enc); +void _ossl_old_des_encrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, _ossl_old_des_key_schedule ks3); +void _ossl_old_des_decrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1, + _ossl_old_des_key_schedule ks2, _ossl_old_des_key_schedule ks3); +void _ossl_old_des_ede3_cbc_encrypt(_ossl_old_des_cblock *input, _ossl_old_des_cblock *output, + long length, _ossl_old_des_key_schedule ks1, _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, _ossl_old_des_cblock *ivec, int enc); +void _ossl_old_des_ede3_cfb64_encrypt(unsigned char *in, unsigned char *out, + long length, _ossl_old_des_key_schedule ks1, _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, _ossl_old_des_cblock *ivec, int *num, int enc); +void _ossl_old_des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out, + long length, _ossl_old_des_key_schedule ks1, _ossl_old_des_key_schedule ks2, + _ossl_old_des_key_schedule ks3, _ossl_old_des_cblock *ivec, int *num); + +void _ossl_old_des_xwhite_in2out(_ossl_old_des_cblock (*des_key), _ossl_old_des_cblock (*in_white), + _ossl_old_des_cblock (*out_white)); + +int _ossl_old_des_enc_read(int fd,char *buf,int len,_ossl_old_des_key_schedule sched, + _ossl_old_des_cblock *iv); +int _ossl_old_des_enc_write(int fd,char *buf,int len,_ossl_old_des_key_schedule sched, + _ossl_old_des_cblock *iv); +char *_ossl_old_des_fcrypt(const char *buf,const char *salt, char *ret); +char *_ossl_old_des_crypt(const char *buf,const char *salt); +#if !defined(PERL5) && !defined(NeXT) +char *_ossl_old_crypt(const char *buf,const char *salt); +#endif +void _ossl_old_des_ofb_encrypt(unsigned char *in,unsigned char *out, + int numbits,long length,_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec); +void _ossl_old_des_pcbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length, + _ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc); +DES_LONG _ossl_old_des_quad_cksum(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output, + long length,int out_count,_ossl_old_des_cblock *seed); +void _ossl_old_des_random_seed(_ossl_old_des_cblock key); +void _ossl_old_des_random_key(_ossl_old_des_cblock ret); +int _ossl_old_des_read_password(_ossl_old_des_cblock *key,const char *prompt,int verify); +int _ossl_old_des_read_2passwords(_ossl_old_des_cblock *key1,_ossl_old_des_cblock *key2, + const char *prompt,int verify); +void _ossl_old_des_set_odd_parity(_ossl_old_des_cblock *key); +int _ossl_old_des_is_weak_key(_ossl_old_des_cblock *key); +int _ossl_old_des_set_key(_ossl_old_des_cblock *key,_ossl_old_des_key_schedule schedule); +int _ossl_old_des_key_sched(_ossl_old_des_cblock *key,_ossl_old_des_key_schedule schedule); +void _ossl_old_des_string_to_key(char *str,_ossl_old_des_cblock *key); +void _ossl_old_des_string_to_2keys(char *str,_ossl_old_des_cblock *key1,_ossl_old_des_cblock *key2); +void _ossl_old_des_cfb64_encrypt(unsigned char *in, unsigned char *out, long length, + _ossl_old_des_key_schedule schedule, _ossl_old_des_cblock *ivec, int *num, int enc); +void _ossl_old_des_ofb64_encrypt(unsigned char *in, unsigned char *out, long length, + _ossl_old_des_key_schedule schedule, _ossl_old_des_cblock *ivec, int *num); + +void _ossl_096_des_random_seed(des_cblock *key); + +/* The following definitions provide compatibility with the MIT Kerberos + * library. The _ossl_old_des_key_schedule structure is not binary compatible. */ + +#define _KERBEROS_DES_H + +#define KRBDES_ENCRYPT DES_ENCRYPT +#define KRBDES_DECRYPT DES_DECRYPT + +#ifdef KERBEROS +# define ENCRYPT DES_ENCRYPT +# define DECRYPT DES_DECRYPT +#endif + +#ifndef NCOMPAT +# define C_Block des_cblock +# define Key_schedule des_key_schedule +# define KEY_SZ DES_KEY_SZ +# define string_to_key des_string_to_key +# define read_pw_string des_read_pw_string +# define random_key des_random_key +# define pcbc_encrypt des_pcbc_encrypt +# define set_key des_set_key +# define key_sched des_key_sched +# define ecb_encrypt des_ecb_encrypt +# define cbc_encrypt des_cbc_encrypt +# define ncbc_encrypt des_ncbc_encrypt +# define xcbc_encrypt des_xcbc_encrypt +# define cbc_cksum des_cbc_cksum +# define quad_cksum des_quad_cksum +# define check_parity des_check_key_parity +#endif + +#define des_fixup_key_parity DES_fixup_key_parity + +#ifdef __cplusplus +} +#endif + +/* for DES_read_pw_string et al */ +#include + +#endif diff --git a/mswin32/OpenSSL/include/openssl/dh.h b/mswin32/OpenSSL/include/openssl/dh.h new file mode 100755 index 000000000..ccdf35ae1 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/dh.h @@ -0,0 +1,234 @@ +/* crypto/dh/dh.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.] + */ + +#ifndef HEADER_DH_H +#define HEADER_DH_H + +#include + +#ifdef OPENSSL_NO_DH +#error DH is disabled. +#endif + +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifndef OPENSSL_DH_MAX_MODULUS_BITS +# define OPENSSL_DH_MAX_MODULUS_BITS 10000 +#endif + +#define DH_FLAG_CACHE_MONT_P 0x01 +#define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dh_st DH; */ +/* typedef struct dh_method DH_METHOD; */ + +struct dh_method + { + const char *name; + /* Methods here */ + int (*generate_key)(DH *dh); + int (*compute_key)(unsigned char *key,const BIGNUM *pub_key,DH *dh); + int (*bn_mod_exp)(const DH *dh, BIGNUM *r, const BIGNUM *a, + const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *m_ctx); /* Can be null */ + + int (*init)(DH *dh); + int (*finish)(DH *dh); + int flags; + char *app_data; + /* If this is non-NULL, it will be used to generate parameters */ + int (*generate_params)(DH *dh, int prime_len, int generator, BN_GENCB *cb); + }; + +struct dh_st + { + /* This first argument is used to pick up errors when + * a DH is passed instead of a EVP_PKEY */ + int pad; + int version; + BIGNUM *p; + BIGNUM *g; + long length; /* optional */ + BIGNUM *pub_key; /* g^x */ + BIGNUM *priv_key; /* x */ + + int flags; + BN_MONT_CTX *method_mont_p; + /* Place holders if we want to do X9.42 DH */ + BIGNUM *q; + BIGNUM *j; + unsigned char *seed; + int seedlen; + BIGNUM *counter; + + int references; + CRYPTO_EX_DATA ex_data; + const DH_METHOD *meth; + ENGINE *engine; + }; + +#define DH_GENERATOR_2 2 +/* #define DH_GENERATOR_3 3 */ +#define DH_GENERATOR_5 5 + +/* DH_check error codes */ +#define DH_CHECK_P_NOT_PRIME 0x01 +#define DH_CHECK_P_NOT_SAFE_PRIME 0x02 +#define DH_UNABLE_TO_CHECK_GENERATOR 0x04 +#define DH_NOT_SUITABLE_GENERATOR 0x08 + +/* DH_check_pub_key error codes */ +#define DH_CHECK_PUBKEY_TOO_SMALL 0x01 +#define DH_CHECK_PUBKEY_TOO_LARGE 0x02 + +/* primes p where (p-1)/2 is prime too are called "safe"; we define + this for backward compatibility: */ +#define DH_CHECK_P_NOT_STRONG_PRIME DH_CHECK_P_NOT_SAFE_PRIME + +#define DHparams_dup(x) ASN1_dup_of_const(DH,i2d_DHparams,d2i_DHparams,x) +#define d2i_DHparams_fp(fp,x) (DH *)ASN1_d2i_fp((char *(*)())DH_new, \ + (char *(*)())d2i_DHparams,(fp),(unsigned char **)(x)) +#define i2d_DHparams_fp(fp,x) ASN1_i2d_fp(i2d_DHparams,(fp), \ + (unsigned char *)(x)) +#define d2i_DHparams_bio(bp,x) ASN1_d2i_bio_of(DH,DH_new,d2i_DHparams,bp,x) +#define i2d_DHparams_bio(bp,x) ASN1_i2d_bio_of_const(DH,i2d_DHparams,bp,x) + +const DH_METHOD *DH_OpenSSL(void); + +void DH_set_default_method(const DH_METHOD *meth); +const DH_METHOD *DH_get_default_method(void); +int DH_set_method(DH *dh, const DH_METHOD *meth); +DH *DH_new_method(ENGINE *engine); + +DH * DH_new(void); +void DH_free(DH *dh); +int DH_up_ref(DH *dh); +int DH_size(const DH *dh); +int DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int DH_set_ex_data(DH *d, int idx, void *arg); +void *DH_get_ex_data(DH *d, int idx); + +/* Deprecated version */ +#ifndef OPENSSL_NO_DEPRECATED +DH * DH_generate_parameters(int prime_len,int generator, + void (*callback)(int,int,void *),void *cb_arg); +#endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DH_generate_parameters_ex(DH *dh, int prime_len,int generator, BN_GENCB *cb); + +int DH_check(const DH *dh,int *codes); +int DH_check_pub_key(const DH *dh,const BIGNUM *pub_key, int *codes); +int DH_generate_key(DH *dh); +int DH_compute_key(unsigned char *key,const BIGNUM *pub_key,DH *dh); +DH * d2i_DHparams(DH **a,const unsigned char **pp, long length); +int i2d_DHparams(const DH *a,unsigned char **pp); +#ifndef OPENSSL_NO_FP_API +int DHparams_print_fp(FILE *fp, const DH *x); +#endif +#ifndef OPENSSL_NO_BIO +int DHparams_print(BIO *bp, const DH *x); +#else +int DHparams_print(char *bp, const DH *x); +#endif + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DH_strings(void); + +/* Error codes for the DH functions. */ + +/* Function codes. */ +#define DH_F_COMPUTE_KEY 102 +#define DH_F_DHPARAMS_PRINT 100 +#define DH_F_DHPARAMS_PRINT_FP 101 +#define DH_F_DH_BUILTIN_GENPARAMS 106 +#define DH_F_DH_NEW_METHOD 105 +#define DH_F_GENERATE_KEY 103 +#define DH_F_GENERATE_PARAMETERS 104 + +/* Reason codes. */ +#define DH_R_BAD_GENERATOR 101 +#define DH_R_INVALID_PUBKEY 102 +#define DH_R_MODULUS_TOO_LARGE 103 +#define DH_R_NO_PRIVATE_VALUE 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/dsa.h b/mswin32/OpenSSL/include/openssl/dsa.h new file mode 100755 index 000000000..3a8fe5b56 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/dsa.h @@ -0,0 +1,285 @@ +/* crypto/dsa/dsa.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.] + */ + +/* + * The DSS routines are based on patches supplied by + * Steven Schoch . He basically did the + * work and I have just tweaked them a little to fit into my + * stylistic vision for SSLeay :-) */ + +#ifndef HEADER_DSA_H +#define HEADER_DSA_H + +#include + +#ifdef OPENSSL_NO_DSA +#error DSA is disabled. +#endif + +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#include + +#ifndef OPENSSL_NO_DEPRECATED +#include +#ifndef OPENSSL_NO_DH +# include +#endif +#endif + +#ifndef OPENSSL_DSA_MAX_MODULUS_BITS +# define OPENSSL_DSA_MAX_MODULUS_BITS 10000 +#endif + +#define DSA_FLAG_CACHE_MONT_P 0x01 +#define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DSA + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dsa_st DSA; */ +/* typedef struct dsa_method DSA_METHOD; */ + +typedef struct DSA_SIG_st + { + BIGNUM *r; + BIGNUM *s; + } DSA_SIG; + +struct dsa_method + { + const char *name; + DSA_SIG * (*dsa_do_sign)(const unsigned char *dgst, int dlen, DSA *dsa); + int (*dsa_sign_setup)(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, + BIGNUM **rp); + int (*dsa_do_verify)(const unsigned char *dgst, int dgst_len, + DSA_SIG *sig, DSA *dsa); + int (*dsa_mod_exp)(DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1, + BIGNUM *a2, BIGNUM *p2, BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *in_mont); + int (*bn_mod_exp)(DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *m_ctx); /* Can be null */ + int (*init)(DSA *dsa); + int (*finish)(DSA *dsa); + int flags; + char *app_data; + /* If this is non-NULL, it is used to generate DSA parameters */ + int (*dsa_paramgen)(DSA *dsa, int bits, + unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, + BN_GENCB *cb); + /* If this is non-NULL, it is used to generate DSA keys */ + int (*dsa_keygen)(DSA *dsa); + }; + +struct dsa_st + { + /* This first variable is used to pick up errors where + * a DSA is passed instead of of a EVP_PKEY */ + int pad; + long version; + int write_params; + BIGNUM *p; + BIGNUM *q; /* == 20 */ + BIGNUM *g; + + BIGNUM *pub_key; /* y public key */ + BIGNUM *priv_key; /* x private key */ + + BIGNUM *kinv; /* Signing pre-calc */ + BIGNUM *r; /* Signing pre-calc */ + + int flags; + /* Normally used to cache montgomery values */ + BN_MONT_CTX *method_mont_p; + int references; + CRYPTO_EX_DATA ex_data; + const DSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; + }; + +#define DSAparams_dup(x) ASN1_dup_of_const(DSA,i2d_DSAparams,d2i_DSAparams,x) +#define d2i_DSAparams_fp(fp,x) (DSA *)ASN1_d2i_fp((char *(*)())DSA_new, \ + (char *(*)())d2i_DSAparams,(fp),(unsigned char **)(x)) +#define i2d_DSAparams_fp(fp,x) ASN1_i2d_fp(i2d_DSAparams,(fp), \ + (unsigned char *)(x)) +#define d2i_DSAparams_bio(bp,x) ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSAparams,bp,x) +#define i2d_DSAparams_bio(bp,x) ASN1_i2d_bio_of_const(DSA,i2d_DSAparams,bp,x) + + +DSA_SIG * DSA_SIG_new(void); +void DSA_SIG_free(DSA_SIG *a); +int i2d_DSA_SIG(const DSA_SIG *a, unsigned char **pp); +DSA_SIG * d2i_DSA_SIG(DSA_SIG **v, const unsigned char **pp, long length); + +DSA_SIG * DSA_do_sign(const unsigned char *dgst,int dlen,DSA *dsa); +int DSA_do_verify(const unsigned char *dgst,int dgst_len, + DSA_SIG *sig,DSA *dsa); + +const DSA_METHOD *DSA_OpenSSL(void); + +void DSA_set_default_method(const DSA_METHOD *); +const DSA_METHOD *DSA_get_default_method(void); +int DSA_set_method(DSA *dsa, const DSA_METHOD *); + +DSA * DSA_new(void); +DSA * DSA_new_method(ENGINE *engine); +void DSA_free (DSA *r); +/* "up" the DSA object's reference count */ +int DSA_up_ref(DSA *r); +int DSA_size(const DSA *); + /* next 4 return -1 on error */ +int DSA_sign_setup( DSA *dsa,BN_CTX *ctx_in,BIGNUM **kinvp,BIGNUM **rp); +int DSA_sign(int type,const unsigned char *dgst,int dlen, + unsigned char *sig, unsigned int *siglen, DSA *dsa); +int DSA_verify(int type,const unsigned char *dgst,int dgst_len, + const unsigned char *sigbuf, int siglen, DSA *dsa); +int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int DSA_set_ex_data(DSA *d, int idx, void *arg); +void *DSA_get_ex_data(DSA *d, int idx); + +DSA * d2i_DSAPublicKey(DSA **a, const unsigned char **pp, long length); +DSA * d2i_DSAPrivateKey(DSA **a, const unsigned char **pp, long length); +DSA * d2i_DSAparams(DSA **a, const unsigned char **pp, long length); + +/* Deprecated version */ +#ifndef OPENSSL_NO_DEPRECATED +DSA * DSA_generate_parameters(int bits, + unsigned char *seed,int seed_len, + int *counter_ret, unsigned long *h_ret,void + (*callback)(int, int, void *),void *cb_arg); +#endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DSA_generate_parameters_ex(DSA *dsa, int bits, + unsigned char *seed,int seed_len, + int *counter_ret, unsigned long *h_ret, BN_GENCB *cb); + +int DSA_generate_key(DSA *a); +int i2d_DSAPublicKey(const DSA *a, unsigned char **pp); +int i2d_DSAPrivateKey(const DSA *a, unsigned char **pp); +int i2d_DSAparams(const DSA *a,unsigned char **pp); + +#ifndef OPENSSL_NO_BIO +int DSAparams_print(BIO *bp, const DSA *x); +int DSA_print(BIO *bp, const DSA *x, int off); +#endif +#ifndef OPENSSL_NO_FP_API +int DSAparams_print_fp(FILE *fp, const DSA *x); +int DSA_print_fp(FILE *bp, const DSA *x, int off); +#endif + +#define DSS_prime_checks 50 +/* Primality test according to FIPS PUB 186[-1], Appendix 2.1: + * 50 rounds of Rabin-Miller */ +#define DSA_is_prime(n, callback, cb_arg) \ + BN_is_prime(n, DSS_prime_checks, callback, NULL, cb_arg) + +#ifndef OPENSSL_NO_DH +/* Convert DSA structure (key or just parameters) into DH structure + * (be careful to avoid small subgroup attacks when using this!) */ +DH *DSA_dup_DH(const DSA *r); +#endif + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DSA_strings(void); + +/* Error codes for the DSA functions. */ + +/* Function codes. */ +#define DSA_F_D2I_DSA_SIG 110 +#define DSA_F_DSAPARAMS_PRINT 100 +#define DSA_F_DSAPARAMS_PRINT_FP 101 +#define DSA_F_DSA_DO_SIGN 112 +#define DSA_F_DSA_DO_VERIFY 113 +#define DSA_F_DSA_NEW_METHOD 103 +#define DSA_F_DSA_PRINT 104 +#define DSA_F_DSA_PRINT_FP 105 +#define DSA_F_DSA_SIGN 106 +#define DSA_F_DSA_SIGN_SETUP 107 +#define DSA_F_DSA_SIG_NEW 109 +#define DSA_F_DSA_VERIFY 108 +#define DSA_F_I2D_DSA_SIG 111 +#define DSA_F_SIG_CB 114 + +/* Reason codes. */ +#define DSA_R_BAD_Q_VALUE 102 +#define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 +#define DSA_R_MISSING_PARAMETERS 101 +#define DSA_R_MODULUS_TOO_LARGE 103 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/dso.h b/mswin32/OpenSSL/include/openssl/dso.h new file mode 100755 index 000000000..3e51913a7 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/dso.h @@ -0,0 +1,368 @@ +/* dso.h -*- mode:C; c-file-style: "eay" -*- */ +/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL + * project 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DSO_H +#define HEADER_DSO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* These values are used as commands to DSO_ctrl() */ +#define DSO_CTRL_GET_FLAGS 1 +#define DSO_CTRL_SET_FLAGS 2 +#define DSO_CTRL_OR_FLAGS 3 + +/* By default, DSO_load() will translate the provided filename into a form + * typical for the platform (more specifically the DSO_METHOD) using the + * dso_name_converter function of the method. Eg. win32 will transform "blah" + * into "blah.dll", and dlfcn will transform it into "libblah.so". The + * behaviour can be overriden by setting the name_converter callback in the DSO + * object (using DSO_set_name_converter()). This callback could even utilise + * the DSO_METHOD's converter too if it only wants to override behaviour for + * one or two possible DSO methods. However, the following flag can be set in a + * DSO to prevent *any* native name-translation at all - eg. if the caller has + * prompted the user for a path to a driver library so the filename should be + * interpreted as-is. */ +#define DSO_FLAG_NO_NAME_TRANSLATION 0x01 +/* An extra flag to give if only the extension should be added as + * translation. This is obviously only of importance on Unix and + * other operating systems where the translation also may prefix + * the name with something, like 'lib', and ignored everywhere else. + * This flag is also ignored if DSO_FLAG_NO_NAME_TRANSLATION is used + * at the same time. */ +#define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY 0x02 + +/* The following flag controls the translation of symbol names to upper + * case. This is currently only being implemented for OpenVMS. + */ +#define DSO_FLAG_UPCASE_SYMBOL 0x10 + +/* This flag loads the library with public symbols. + * Meaning: The exported symbols of this library are public + * to all libraries loaded after this library. + * At the moment only implemented in unix. + */ +#define DSO_FLAG_GLOBAL_SYMBOLS 0x20 + + +typedef void (*DSO_FUNC_TYPE)(void); + +typedef struct dso_st DSO; + +/* The function prototype used for method functions (or caller-provided + * callbacks) that transform filenames. They are passed a DSO structure pointer + * (or NULL if they are to be used independantly of a DSO object) and a + * filename to transform. They should either return NULL (if there is an error + * condition) or a newly allocated string containing the transformed form that + * the caller will need to free with OPENSSL_free() when done. */ +typedef char* (*DSO_NAME_CONVERTER_FUNC)(DSO *, const char *); +/* The function prototype used for method functions (or caller-provided + * callbacks) that merge two file specifications. They are passed a + * DSO structure pointer (or NULL if they are to be used independantly of + * a DSO object) and two file specifications to merge. They should + * either return NULL (if there is an error condition) or a newly allocated + * string containing the result of merging that the caller will need + * to free with OPENSSL_free() when done. + * Here, merging means that bits and pieces are taken from each of the + * file specifications and added together in whatever fashion that is + * sensible for the DSO method in question. The only rule that really + * applies is that if the two specification contain pieces of the same + * type, the copy from the first string takes priority. One could see + * it as the first specification is the one given by the user and the + * second being a bunch of defaults to add on if they're missing in the + * first. */ +typedef char* (*DSO_MERGER_FUNC)(DSO *, const char *, const char *); + +typedef struct dso_meth_st + { + const char *name; + /* Loads a shared library, NB: new DSO_METHODs must ensure that a + * successful load populates the loaded_filename field, and likewise a + * successful unload OPENSSL_frees and NULLs it out. */ + int (*dso_load)(DSO *dso); + /* Unloads a shared library */ + int (*dso_unload)(DSO *dso); + /* Binds a variable */ + void *(*dso_bind_var)(DSO *dso, const char *symname); + /* Binds a function - assumes a return type of DSO_FUNC_TYPE. + * This should be cast to the real function prototype by the + * caller. Platforms that don't have compatible representations + * for different prototypes (this is possible within ANSI C) + * are highly unlikely to have shared libraries at all, let + * alone a DSO_METHOD implemented for them. */ + DSO_FUNC_TYPE (*dso_bind_func)(DSO *dso, const char *symname); + +/* I don't think this would actually be used in any circumstances. */ +#if 0 + /* Unbinds a variable */ + int (*dso_unbind_var)(DSO *dso, char *symname, void *symptr); + /* Unbinds a function */ + int (*dso_unbind_func)(DSO *dso, char *symname, DSO_FUNC_TYPE symptr); +#endif + /* The generic (yuck) "ctrl()" function. NB: Negative return + * values (rather than zero) indicate errors. */ + long (*dso_ctrl)(DSO *dso, int cmd, long larg, void *parg); + /* The default DSO_METHOD-specific function for converting filenames to + * a canonical native form. */ + DSO_NAME_CONVERTER_FUNC dso_name_converter; + /* The default DSO_METHOD-specific function for converting filenames to + * a canonical native form. */ + DSO_MERGER_FUNC dso_merger; + + /* [De]Initialisation handlers. */ + int (*init)(DSO *dso); + int (*finish)(DSO *dso); + } DSO_METHOD; + +/**********************************************************************/ +/* The low-level handle type used to refer to a loaded shared library */ + +struct dso_st + { + DSO_METHOD *meth; + /* Standard dlopen uses a (void *). Win32 uses a HANDLE. VMS + * doesn't use anything but will need to cache the filename + * for use in the dso_bind handler. All in all, let each + * method control its own destiny. "Handles" and such go in + * a STACK. */ + STACK *meth_data; + int references; + int flags; + /* For use by applications etc ... use this for your bits'n'pieces, + * don't touch meth_data! */ + CRYPTO_EX_DATA ex_data; + /* If this callback function pointer is set to non-NULL, then it will + * be used in DSO_load() in place of meth->dso_name_converter. NB: This + * should normally set using DSO_set_name_converter(). */ + DSO_NAME_CONVERTER_FUNC name_converter; + /* If this callback function pointer is set to non-NULL, then it will + * be used in DSO_load() in place of meth->dso_merger. NB: This + * should normally set using DSO_set_merger(). */ + DSO_MERGER_FUNC merger; + /* This is populated with (a copy of) the platform-independant + * filename used for this DSO. */ + char *filename; + /* This is populated with (a copy of) the translated filename by which + * the DSO was actually loaded. It is NULL iff the DSO is not currently + * loaded. NB: This is here because the filename translation process + * may involve a callback being invoked more than once not only to + * convert to a platform-specific form, but also to try different + * filenames in the process of trying to perform a load. As such, this + * variable can be used to indicate (a) whether this DSO structure + * corresponds to a loaded library or not, and (b) the filename with + * which it was actually loaded. */ + char *loaded_filename; + }; + + +DSO * DSO_new(void); +DSO * DSO_new_method(DSO_METHOD *method); +int DSO_free(DSO *dso); +int DSO_flags(DSO *dso); +int DSO_up_ref(DSO *dso); +long DSO_ctrl(DSO *dso, int cmd, long larg, void *parg); + +/* This function sets the DSO's name_converter callback. If it is non-NULL, + * then it will be used instead of the associated DSO_METHOD's function. If + * oldcb is non-NULL then it is set to the function pointer value being + * replaced. Return value is non-zero for success. */ +int DSO_set_name_converter(DSO *dso, DSO_NAME_CONVERTER_FUNC cb, + DSO_NAME_CONVERTER_FUNC *oldcb); +/* These functions can be used to get/set the platform-independant filename + * used for a DSO. NB: set will fail if the DSO is already loaded. */ +const char *DSO_get_filename(DSO *dso); +int DSO_set_filename(DSO *dso, const char *filename); +/* This function will invoke the DSO's name_converter callback to translate a + * filename, or if the callback isn't set it will instead use the DSO_METHOD's + * converter. If "filename" is NULL, the "filename" in the DSO itself will be + * used. If the DSO_FLAG_NO_NAME_TRANSLATION flag is set, then the filename is + * simply duplicated. NB: This function is usually called from within a + * DSO_METHOD during the processing of a DSO_load() call, and is exposed so that + * caller-created DSO_METHODs can do the same thing. A non-NULL return value + * will need to be OPENSSL_free()'d. */ +char *DSO_convert_filename(DSO *dso, const char *filename); +/* This function will invoke the DSO's merger callback to merge two file + * specifications, or if the callback isn't set it will instead use the + * DSO_METHOD's merger. A non-NULL return value will need to be + * OPENSSL_free()'d. */ +char *DSO_merge(DSO *dso, const char *filespec1, const char *filespec2); +/* If the DSO is currently loaded, this returns the filename that it was loaded + * under, otherwise it returns NULL. So it is also useful as a test as to + * whether the DSO is currently loaded. NB: This will not necessarily return + * the same value as DSO_convert_filename(dso, dso->filename), because the + * DSO_METHOD's load function may have tried a variety of filenames (with + * and/or without the aid of the converters) before settling on the one it + * actually loaded. */ +const char *DSO_get_loaded_filename(DSO *dso); + +void DSO_set_default_method(DSO_METHOD *meth); +DSO_METHOD *DSO_get_default_method(void); +DSO_METHOD *DSO_get_method(DSO *dso); +DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth); + +/* The all-singing all-dancing load function, you normally pass NULL + * for the first and third parameters. Use DSO_up and DSO_free for + * subsequent reference count handling. Any flags passed in will be set + * in the constructed DSO after its init() function but before the + * load operation. If 'dso' is non-NULL, 'flags' is ignored. */ +DSO *DSO_load(DSO *dso, const char *filename, DSO_METHOD *meth, int flags); + +/* This function binds to a variable inside a shared library. */ +void *DSO_bind_var(DSO *dso, const char *symname); + +/* This function binds to a function inside a shared library. */ +DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname); + +/* This method is the default, but will beg, borrow, or steal whatever + * method should be the default on any particular platform (including + * DSO_METH_null() if necessary). */ +DSO_METHOD *DSO_METHOD_openssl(void); + +/* This method is defined for all platforms - if a platform has no + * DSO support then this will be the only method! */ +DSO_METHOD *DSO_METHOD_null(void); + +/* If DSO_DLFCN is defined, the standard dlfcn.h-style functions + * (dlopen, dlclose, dlsym, etc) will be used and incorporated into + * this method. If not, this method will return NULL. */ +DSO_METHOD *DSO_METHOD_dlfcn(void); + +/* If DSO_DL is defined, the standard dl.h-style functions (shl_load, + * shl_unload, shl_findsym, etc) will be used and incorporated into + * this method. If not, this method will return NULL. */ +DSO_METHOD *DSO_METHOD_dl(void); + +/* If WIN32 is defined, use DLLs. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_win32(void); + +/* If VMS is defined, use shared images. If not, return NULL. */ +DSO_METHOD *DSO_METHOD_vms(void); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_DSO_strings(void); + +/* Error codes for the DSO functions. */ + +/* Function codes. */ +#define DSO_F_DLFCN_BIND_FUNC 100 +#define DSO_F_DLFCN_BIND_VAR 101 +#define DSO_F_DLFCN_LOAD 102 +#define DSO_F_DLFCN_MERGER 130 +#define DSO_F_DLFCN_NAME_CONVERTER 123 +#define DSO_F_DLFCN_UNLOAD 103 +#define DSO_F_DL_BIND_FUNC 104 +#define DSO_F_DL_BIND_VAR 105 +#define DSO_F_DL_LOAD 106 +#define DSO_F_DL_MERGER 131 +#define DSO_F_DL_NAME_CONVERTER 124 +#define DSO_F_DL_UNLOAD 107 +#define DSO_F_DSO_BIND_FUNC 108 +#define DSO_F_DSO_BIND_VAR 109 +#define DSO_F_DSO_CONVERT_FILENAME 126 +#define DSO_F_DSO_CTRL 110 +#define DSO_F_DSO_FREE 111 +#define DSO_F_DSO_GET_FILENAME 127 +#define DSO_F_DSO_GET_LOADED_FILENAME 128 +#define DSO_F_DSO_LOAD 112 +#define DSO_F_DSO_MERGE 132 +#define DSO_F_DSO_NEW_METHOD 113 +#define DSO_F_DSO_SET_FILENAME 129 +#define DSO_F_DSO_SET_NAME_CONVERTER 122 +#define DSO_F_DSO_UP_REF 114 +#define DSO_F_VMS_BIND_SYM 115 +#define DSO_F_VMS_LOAD 116 +#define DSO_F_VMS_MERGER 133 +#define DSO_F_VMS_UNLOAD 117 +#define DSO_F_WIN32_BIND_FUNC 118 +#define DSO_F_WIN32_BIND_VAR 119 +#define DSO_F_WIN32_JOINER 135 +#define DSO_F_WIN32_LOAD 120 +#define DSO_F_WIN32_MERGER 134 +#define DSO_F_WIN32_NAME_CONVERTER 125 +#define DSO_F_WIN32_SPLITTER 136 +#define DSO_F_WIN32_UNLOAD 121 + +/* Reason codes. */ +#define DSO_R_CTRL_FAILED 100 +#define DSO_R_DSO_ALREADY_LOADED 110 +#define DSO_R_EMPTY_FILE_STRUCTURE 113 +#define DSO_R_FAILURE 114 +#define DSO_R_FILENAME_TOO_BIG 101 +#define DSO_R_FINISH_FAILED 102 +#define DSO_R_INCORRECT_FILE_SYNTAX 115 +#define DSO_R_LOAD_FAILED 103 +#define DSO_R_NAME_TRANSLATION_FAILED 109 +#define DSO_R_NO_FILENAME 111 +#define DSO_R_NO_FILE_SPECIFICATION 116 +#define DSO_R_NULL_HANDLE 104 +#define DSO_R_SET_FILENAME_FAILED 112 +#define DSO_R_STACK_ERROR 105 +#define DSO_R_SYM_FAILURE 106 +#define DSO_R_UNLOAD_FAILED 107 +#define DSO_R_UNSUPPORTED 108 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/dtls1.h b/mswin32/OpenSSL/include/openssl/dtls1.h new file mode 100755 index 000000000..a663cf85f --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/dtls1.h @@ -0,0 +1,211 @@ +/* ssl/dtls1.h */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DTLS1_H +#define HEADER_DTLS1_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define DTLS1_VERSION 0xFEFF +#define DTLS1_BAD_VER 0x0100 + +#define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE 110 + +/* lengths of messages */ +#define DTLS1_COOKIE_LENGTH 32 + +#define DTLS1_RT_HEADER_LENGTH 13 + +#define DTLS1_HM_HEADER_LENGTH 12 + +#define DTLS1_HM_BAD_FRAGMENT -2 +#define DTLS1_HM_FRAGMENT_RETRY -3 + +#define DTLS1_CCS_HEADER_LENGTH 1 + +#define DTLS1_AL_HEADER_LENGTH 7 + + +typedef struct dtls1_bitmap_st + { + PQ_64BIT map; + unsigned long length; /* sizeof the bitmap in bits */ + PQ_64BIT max_seq_num; /* max record number seen so far */ + } DTLS1_BITMAP; + +struct hm_header_st + { + unsigned char type; + unsigned long msg_len; + unsigned short seq; + unsigned long frag_off; + unsigned long frag_len; + unsigned int is_ccs; + }; + +struct ccs_header_st + { + unsigned char type; + unsigned short seq; + }; + +struct dtls1_timeout_st + { + /* Number of read timeouts so far */ + unsigned int read_timeouts; + + /* Number of write timeouts so far */ + unsigned int write_timeouts; + + /* Number of alerts received so far */ + unsigned int num_alerts; + }; + +typedef struct record_pqueue_st + { + unsigned short epoch; + pqueue q; + } record_pqueue; + +typedef struct hm_fragment_st + { + struct hm_header_st msg_header; + unsigned char *fragment; + } hm_fragment; + +typedef struct dtls1_state_st + { + unsigned int send_cookie; + unsigned char cookie[DTLS1_COOKIE_LENGTH]; + unsigned char rcvd_cookie[DTLS1_COOKIE_LENGTH]; + unsigned int cookie_len; + + /* + * The current data and handshake epoch. This is initially + * undefined, and starts at zero once the initial handshake is + * completed + */ + unsigned short r_epoch; + unsigned short w_epoch; + + /* records being received in the current epoch */ + DTLS1_BITMAP bitmap; + + /* renegotiation starts a new set of sequence numbers */ + DTLS1_BITMAP next_bitmap; + + /* handshake message numbers */ + unsigned short handshake_write_seq; + unsigned short next_handshake_write_seq; + + unsigned short handshake_read_seq; + + /* Received handshake records (processed and unprocessed) */ + record_pqueue unprocessed_rcds; + record_pqueue processed_rcds; + + /* Buffered handshake messages */ + pqueue buffered_messages; + + /* Buffered (sent) handshake records */ + pqueue sent_messages; + + unsigned int mtu; /* max wire packet size */ + + struct hm_header_st w_msg_hdr; + struct hm_header_st r_msg_hdr; + + struct dtls1_timeout_st timeout; + + /* storage for Alert/Handshake protocol data received but not + * yet processed by ssl3_read_bytes: */ + unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH]; + unsigned int alert_fragment_len; + unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH]; + unsigned int handshake_fragment_len; + + unsigned int retransmitting; + + } DTLS1_STATE; + +typedef struct dtls1_record_data_st + { + unsigned char *packet; + unsigned int packet_length; + SSL3_BUFFER rbuf; + SSL3_RECORD rrec; + } DTLS1_RECORD_DATA; + + +/* Timeout multipliers (timeout slice is defined in apps/timeouts.h */ +#define DTLS1_TMO_READ_COUNT 2 +#define DTLS1_TMO_WRITE_COUNT 2 + +#define DTLS1_TMO_ALERT_COUNT 12 + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/mswin32/OpenSSL/include/openssl/e_os2.h b/mswin32/OpenSSL/include/openssl/e_os2.h new file mode 100755 index 000000000..9da0b6544 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/e_os2.h @@ -0,0 +1,279 @@ +/* e_os2.h */ +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#include + +#ifndef HEADER_E_OS2_H +#define HEADER_E_OS2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Detect operating systems. This probably needs completing. + * The result is that at least one OPENSSL_SYS_os macro should be defined. + * However, if none is defined, Unix is assumed. + **/ + +#define OPENSSL_SYS_UNIX + +/* ----------------------- Macintosh, before MacOS X ----------------------- */ +#if defined(__MWERKS__) && defined(macintosh) || defined(OPENSSL_SYSNAME_MAC) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_MACINTOSH_CLASSIC +#endif + +/* ----------------------- NetWare ----------------------------------------- */ +#if defined(NETWARE) || defined(OPENSSL_SYSNAME_NETWARE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_NETWARE +#endif + +/* ---------------------- Microsoft operating systems ---------------------- */ + +/* Note that MSDOS actually denotes 32-bit environments running on top of + MS-DOS, such as DJGPP one. */ +#if defined(OPENSSL_SYSNAME_MSDOS) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_MSDOS +#endif + +/* For 32 bit environment, there seems to be the CygWin environment and then + all the others that try to do the same thing Microsoft does... */ +#if defined(OPENSSL_SYSNAME_UWIN) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_UWIN +#else +# if defined(__CYGWIN32__) || defined(OPENSSL_SYSNAME_CYGWIN32) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_CYGWIN +# else +# if defined(_WIN32) || defined(OPENSSL_SYSNAME_WIN32) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32 +# endif +# if defined(OPENSSL_SYSNAME_WINNT) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINNT +# endif +# if defined(OPENSSL_SYSNAME_WINCE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINCE +# endif +# endif +#endif + +/* Anything that tries to look like Microsoft is "Windows" */ +#if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_SYS_MSDOS +# define OPENSSL_SYS_MSDOS +# endif +#endif + +/* DLL settings. This part is a bit tough, because it's up to the application + implementor how he or she will link the application, so it requires some + macro to be used. */ +#ifdef OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_OPT_WINDLL +# if defined(_WINDLL) /* This is used when building OpenSSL to indicate that + DLL linkage should be used */ +# define OPENSSL_OPT_WINDLL +# endif +# endif +#endif + +/* -------------------------------- OpenVMS -------------------------------- */ +#if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYSNAME_VMS) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_VMS +# if defined(__DECC) +# define OPENSSL_SYS_VMS_DECC +# elif defined(__DECCXX) +# define OPENSSL_SYS_VMS_DECC +# define OPENSSL_SYS_VMS_DECCXX +# else +# define OPENSSL_SYS_VMS_NODECC +# endif +#endif + +/* --------------------------------- OS/2 ---------------------------------- */ +#if defined(__EMX__) || defined(__OS2__) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_OS2 +#endif + +/* --------------------------------- Unix ---------------------------------- */ +#ifdef OPENSSL_SYS_UNIX +# if defined(linux) || defined(__linux__) || defined(OPENSSL_SYSNAME_LINUX) +# define OPENSSL_SYS_LINUX +# endif +# ifdef OPENSSL_SYSNAME_MPE +# define OPENSSL_SYS_MPE +# endif +# ifdef OPENSSL_SYSNAME_SNI +# define OPENSSL_SYS_SNI +# endif +# ifdef OPENSSL_SYSNAME_ULTRASPARC +# define OPENSSL_SYS_ULTRASPARC +# endif +# ifdef OPENSSL_SYSNAME_NEWS4 +# define OPENSSL_SYS_NEWS4 +# endif +# ifdef OPENSSL_SYSNAME_MACOSX +# define OPENSSL_SYS_MACOSX +# endif +# ifdef OPENSSL_SYSNAME_MACOSX_RHAPSODY +# define OPENSSL_SYS_MACOSX_RHAPSODY +# define OPENSSL_SYS_MACOSX +# endif +# ifdef OPENSSL_SYSNAME_SUNOS +# define OPENSSL_SYS_SUNOS +#endif +# if defined(_CRAY) || defined(OPENSSL_SYSNAME_CRAY) +# define OPENSSL_SYS_CRAY +# endif +# if defined(_AIX) || defined(OPENSSL_SYSNAME_AIX) +# define OPENSSL_SYS_AIX +# endif +#endif + +/* --------------------------------- VOS ----------------------------------- */ +#ifdef OPENSSL_SYSNAME_VOS +# define OPENSSL_SYS_VOS +#endif + +/* ------------------------------- VxWorks --------------------------------- */ +#ifdef OPENSSL_SYSNAME_VXWORKS +# define OPENSSL_SYS_VXWORKS +#endif + +/** + * That's it for OS-specific stuff + *****************************************************************************/ + + +/* Specials for I/O an exit */ +#ifdef OPENSSL_SYS_MSDOS +# define OPENSSL_UNISTD_IO +# define OPENSSL_DECLARE_EXIT extern void exit(int); +#else +# define OPENSSL_UNISTD_IO OPENSSL_UNISTD +# define OPENSSL_DECLARE_EXIT /* declared in unistd.h */ +#endif + +/* Definitions of OPENSSL_GLOBAL and OPENSSL_EXTERN, to define and declare + certain global symbols that, with some compilers under VMS, have to be + defined and declared explicitely with globaldef and globalref. + Definitions of OPENSSL_EXPORT and OPENSSL_IMPORT, to define and declare + DLL exports and imports for compilers under Win32. These are a little + more complicated to use. Basically, for any library that exports some + global variables, the following code must be present in the header file + that declares them, before OPENSSL_EXTERN is used: + + #ifdef SOME_BUILD_FLAG_MACRO + # undef OPENSSL_EXTERN + # define OPENSSL_EXTERN OPENSSL_EXPORT + #endif + + The default is to have OPENSSL_EXPORT, OPENSSL_IMPORT and OPENSSL_GLOBAL + have some generally sensible values, and for OPENSSL_EXTERN to have the + value OPENSSL_IMPORT. +*/ + +#if defined(OPENSSL_SYS_VMS_NODECC) +# define OPENSSL_EXPORT globalref +# define OPENSSL_IMPORT globalref +# define OPENSSL_GLOBAL globaldef +#elif defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) +# define OPENSSL_EXPORT extern __declspec(dllexport) +# define OPENSSL_IMPORT extern __declspec(dllimport) +# define OPENSSL_GLOBAL +#else +# define OPENSSL_EXPORT extern +# define OPENSSL_IMPORT extern +# define OPENSSL_GLOBAL +#endif +#define OPENSSL_EXTERN OPENSSL_IMPORT + +/* Macros to allow global variables to be reached through function calls when + required (if a shared library version requvres it, for example. + The way it's done allows definitions like this: + + // in foobar.c + OPENSSL_IMPLEMENT_GLOBAL(int,foobar) = 0; + // in foobar.h + OPENSSL_DECLARE_GLOBAL(int,foobar); + #define foobar OPENSSL_GLOBAL_REF(foobar) +*/ +#ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION +# define OPENSSL_IMPLEMENT_GLOBAL(type,name) \ + extern type _hide_##name; \ + type *_shadow_##name(void) { return &_hide_##name; } \ + static type _hide_##name +# define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void) +# define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name())) +#else +# define OPENSSL_IMPLEMENT_GLOBAL(type,name) OPENSSL_GLOBAL type _shadow_##name +# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name +# define OPENSSL_GLOBAL_REF(name) _shadow_##name +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/ebcdic.h b/mswin32/OpenSSL/include/openssl/ebcdic.h new file mode 100755 index 000000000..6d65afcf9 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ebcdic.h @@ -0,0 +1,19 @@ +/* crypto/ebcdic.h */ + +#ifndef HEADER_EBCDIC_H +#define HEADER_EBCDIC_H + +#include + +/* Avoid name clashes with other applications */ +#define os_toascii _openssl_os_toascii +#define os_toebcdic _openssl_os_toebcdic +#define ebcdic2ascii _openssl_ebcdic2ascii +#define ascii2ebcdic _openssl_ascii2ebcdic + +extern const unsigned char os_toascii[256]; +extern const unsigned char os_toebcdic[256]; +void *ebcdic2ascii(void *dest, const void *srce, size_t count); +void *ascii2ebcdic(void *dest, const void *srce, size_t count); + +#endif diff --git a/mswin32/OpenSSL/include/openssl/ec.h b/mswin32/OpenSSL/include/openssl/ec.h new file mode 100755 index 000000000..8bc2a235b --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ec.h @@ -0,0 +1,526 @@ +/* crypto/ec/ec.h */ +/* + * Originally written by Bodo Moeller for the OpenSSL project. + */ +/* ==================================================================== + * Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * The elliptic curve binary polynomial software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_EC_H +#define HEADER_EC_H + +#include + +#ifdef OPENSSL_NO_EC +#error EC is disabled. +#endif + +#include +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifdef __cplusplus +extern "C" { +#elif defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (off,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +#endif + + +#ifndef OPENSSL_ECC_MAX_FIELD_BITS +# define OPENSSL_ECC_MAX_FIELD_BITS 661 +#endif + +typedef enum { + /* values as defined in X9.62 (ECDSA) and elsewhere */ + POINT_CONVERSION_COMPRESSED = 2, + POINT_CONVERSION_UNCOMPRESSED = 4, + POINT_CONVERSION_HYBRID = 6 +} point_conversion_form_t; + + +typedef struct ec_method_st EC_METHOD; + +typedef struct ec_group_st + /* + EC_METHOD *meth; + -- field definition + -- curve coefficients + -- optional generator with associated information (order, cofactor) + -- optional extra data (precomputed table for fast computation of multiples of generator) + -- ASN1 stuff + */ + EC_GROUP; + +typedef struct ec_point_st EC_POINT; + + +/* EC_METHODs for curves over GF(p). + * EC_GFp_simple_method provides the basis for the optimized methods. + */ +const EC_METHOD *EC_GFp_simple_method(void); +const EC_METHOD *EC_GFp_mont_method(void); +const EC_METHOD *EC_GFp_nist_method(void); + +/* EC_METHOD for curves over GF(2^m). + */ +const EC_METHOD *EC_GF2m_simple_method(void); + + +EC_GROUP *EC_GROUP_new(const EC_METHOD *); +void EC_GROUP_free(EC_GROUP *); +void EC_GROUP_clear_free(EC_GROUP *); +int EC_GROUP_copy(EC_GROUP *, const EC_GROUP *); +EC_GROUP *EC_GROUP_dup(const EC_GROUP *); + +const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *); +int EC_METHOD_get_field_type(const EC_METHOD *); + +int EC_GROUP_set_generator(EC_GROUP *, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor); +const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *); +int EC_GROUP_get_order(const EC_GROUP *, BIGNUM *order, BN_CTX *); +int EC_GROUP_get_cofactor(const EC_GROUP *, BIGNUM *cofactor, BN_CTX *); + +void EC_GROUP_set_curve_name(EC_GROUP *, int nid); +int EC_GROUP_get_curve_name(const EC_GROUP *); + +void EC_GROUP_set_asn1_flag(EC_GROUP *, int flag); +int EC_GROUP_get_asn1_flag(const EC_GROUP *); + +void EC_GROUP_set_point_conversion_form(EC_GROUP *, point_conversion_form_t); +point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *); + +unsigned char *EC_GROUP_get0_seed(const EC_GROUP *); +size_t EC_GROUP_get_seed_len(const EC_GROUP *); +size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len); + +int EC_GROUP_set_curve_GFp(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); +int EC_GROUP_get_curve_GFp(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *); +int EC_GROUP_set_curve_GF2m(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); +int EC_GROUP_get_curve_GF2m(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *); + +/* returns the number of bits needed to represent a field element */ +int EC_GROUP_get_degree(const EC_GROUP *); + +/* EC_GROUP_check() returns 1 if 'group' defines a valid group, 0 otherwise */ +int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx); +/* EC_GROUP_check_discriminant() returns 1 if the discriminant of the + * elliptic curve is not zero, 0 otherwise */ +int EC_GROUP_check_discriminant(const EC_GROUP *, BN_CTX *); + +/* EC_GROUP_cmp() returns 0 if both groups are equal and 1 otherwise */ +int EC_GROUP_cmp(const EC_GROUP *, const EC_GROUP *, BN_CTX *); + +/* EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*() + * after choosing an appropriate EC_METHOD */ +EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); +EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); + +/* EC_GROUP_new_by_curve_name() creates a EC_GROUP structure + * specified by a curve name (in form of a NID) */ +EC_GROUP *EC_GROUP_new_by_curve_name(int nid); +/* handling of internal curves */ +typedef struct { + int nid; + const char *comment; + } EC_builtin_curve; +/* EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number + * of all available curves or zero if a error occurred. + * In case r ist not zero nitems EC_builtin_curve structures + * are filled with the data of the first nitems internal groups */ +size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); + + +/* EC_POINT functions */ + +EC_POINT *EC_POINT_new(const EC_GROUP *); +void EC_POINT_free(EC_POINT *); +void EC_POINT_clear_free(EC_POINT *); +int EC_POINT_copy(EC_POINT *, const EC_POINT *); +EC_POINT *EC_POINT_dup(const EC_POINT *, const EC_GROUP *); + +const EC_METHOD *EC_POINT_method_of(const EC_POINT *); + +int EC_POINT_set_to_infinity(const EC_GROUP *, EC_POINT *); +int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *, EC_POINT *, + const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *); +int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *, const EC_POINT *, + BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *); +int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *, EC_POINT *, + const BIGNUM *x, const BIGNUM *y, BN_CTX *); +int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *, const EC_POINT *, + BIGNUM *x, BIGNUM *y, BN_CTX *); +int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *, EC_POINT *, + const BIGNUM *x, int y_bit, BN_CTX *); + +int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *, EC_POINT *, + const BIGNUM *x, const BIGNUM *y, BN_CTX *); +int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *, const EC_POINT *, + BIGNUM *x, BIGNUM *y, BN_CTX *); +int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *, EC_POINT *, + const BIGNUM *x, int y_bit, BN_CTX *); + +size_t EC_POINT_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form, + unsigned char *buf, size_t len, BN_CTX *); +int EC_POINT_oct2point(const EC_GROUP *, EC_POINT *, + const unsigned char *buf, size_t len, BN_CTX *); + +/* other interfaces to point2oct/oct2point: */ +BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BIGNUM *, BN_CTX *); +EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *, + EC_POINT *, BN_CTX *); +char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BN_CTX *); +EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *, + EC_POINT *, BN_CTX *); + +int EC_POINT_add(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *); +int EC_POINT_dbl(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *); +int EC_POINT_invert(const EC_GROUP *, EC_POINT *, BN_CTX *); + +int EC_POINT_is_at_infinity(const EC_GROUP *, const EC_POINT *); +int EC_POINT_is_on_curve(const EC_GROUP *, const EC_POINT *, BN_CTX *); +int EC_POINT_cmp(const EC_GROUP *, const EC_POINT *a, const EC_POINT *b, BN_CTX *); + +int EC_POINT_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *); +int EC_POINTs_make_affine(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *); + + +int EC_POINTs_mul(const EC_GROUP *, EC_POINT *r, const BIGNUM *, size_t num, const EC_POINT *[], const BIGNUM *[], BN_CTX *); +int EC_POINT_mul(const EC_GROUP *, EC_POINT *r, const BIGNUM *, const EC_POINT *, const BIGNUM *, BN_CTX *); + +/* EC_GROUP_precompute_mult() stores multiples of generator for faster point multiplication */ +int EC_GROUP_precompute_mult(EC_GROUP *, BN_CTX *); +/* EC_GROUP_have_precompute_mult() reports whether such precomputation has been done */ +int EC_GROUP_have_precompute_mult(const EC_GROUP *); + + + +/* ASN1 stuff */ + +/* EC_GROUP_get_basis_type() returns the NID of the basis type + * used to represent the field elements */ +int EC_GROUP_get_basis_type(const EC_GROUP *); +int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); +int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, + unsigned int *k2, unsigned int *k3); + +#define OPENSSL_EC_NAMED_CURVE 0x001 + +typedef struct ecpk_parameters_st ECPKPARAMETERS; + +EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len); +int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out); + +#define d2i_ECPKParameters_bio(bp,x) ASN1_d2i_bio_of(EC_GROUP,NULL,d2i_ECPKParameters,bp,x) +#define i2d_ECPKParameters_bio(bp,x) ASN1_i2d_bio_of_const(EC_GROUP,i2d_ECPKParameters,bp,x) +#define d2i_ECPKParameters_fp(fp,x) (EC_GROUP *)ASN1_d2i_fp(NULL, \ + (char *(*)())d2i_ECPKParameters,(fp),(unsigned char **)(x)) +#define i2d_ECPKParameters_fp(fp,x) ASN1_i2d_fp(i2d_ECPKParameters,(fp), \ + (unsigned char *)(x)) + +#ifndef OPENSSL_NO_BIO +int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off); +#endif +#ifndef OPENSSL_NO_FP_API +int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off); +#endif + +/* the EC_KEY stuff */ +typedef struct ec_key_st EC_KEY; + +/* some values for the encoding_flag */ +#define EC_PKEY_NO_PARAMETERS 0x001 +#define EC_PKEY_NO_PUBKEY 0x002 + +EC_KEY *EC_KEY_new(void); +EC_KEY *EC_KEY_new_by_curve_name(int nid); +void EC_KEY_free(EC_KEY *); +EC_KEY *EC_KEY_copy(EC_KEY *, const EC_KEY *); +EC_KEY *EC_KEY_dup(const EC_KEY *); + +int EC_KEY_up_ref(EC_KEY *); + +const EC_GROUP *EC_KEY_get0_group(const EC_KEY *); +int EC_KEY_set_group(EC_KEY *, const EC_GROUP *); +const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *); +int EC_KEY_set_private_key(EC_KEY *, const BIGNUM *); +const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *); +int EC_KEY_set_public_key(EC_KEY *, const EC_POINT *); +unsigned EC_KEY_get_enc_flags(const EC_KEY *); +void EC_KEY_set_enc_flags(EC_KEY *, unsigned int); +point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *); +void EC_KEY_set_conv_form(EC_KEY *, point_conversion_form_t); +/* functions to set/get method specific data */ +void *EC_KEY_get_key_method_data(EC_KEY *, + void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); +void EC_KEY_insert_key_method_data(EC_KEY *, void *data, + void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); +/* wrapper functions for the underlying EC_GROUP object */ +void EC_KEY_set_asn1_flag(EC_KEY *, int); +int EC_KEY_precompute_mult(EC_KEY *, BN_CTX *ctx); + +/* EC_KEY_generate_key() creates a ec private (public) key */ +int EC_KEY_generate_key(EC_KEY *); +/* EC_KEY_check_key() */ +int EC_KEY_check_key(const EC_KEY *); + +/* de- and encoding functions for SEC1 ECPrivateKey */ +EC_KEY *d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len); +int i2d_ECPrivateKey(EC_KEY *a, unsigned char **out); +/* de- and encoding functions for EC parameters */ +EC_KEY *d2i_ECParameters(EC_KEY **a, const unsigned char **in, long len); +int i2d_ECParameters(EC_KEY *a, unsigned char **out); +/* de- and encoding functions for EC public key + * (octet string, not DER -- hence 'o2i' and 'i2o') */ +EC_KEY *o2i_ECPublicKey(EC_KEY **a, const unsigned char **in, long len); +int i2o_ECPublicKey(EC_KEY *a, unsigned char **out); + +#ifndef OPENSSL_NO_BIO +int ECParameters_print(BIO *bp, const EC_KEY *x); +int EC_KEY_print(BIO *bp, const EC_KEY *x, int off); +#endif +#ifndef OPENSSL_NO_FP_API +int ECParameters_print_fp(FILE *fp, const EC_KEY *x); +int EC_KEY_print_fp(FILE *fp, const EC_KEY *x, int off); +#endif + +#define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x) + +#ifndef __cplusplus +#if defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif +#endif + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_EC_strings(void); + +/* Error codes for the EC functions. */ + +/* Function codes. */ +#define EC_F_COMPUTE_WNAF 143 +#define EC_F_D2I_ECPARAMETERS 144 +#define EC_F_D2I_ECPKPARAMETERS 145 +#define EC_F_D2I_ECPRIVATEKEY 146 +#define EC_F_ECPARAMETERS_PRINT 147 +#define EC_F_ECPARAMETERS_PRINT_FP 148 +#define EC_F_ECPKPARAMETERS_PRINT 149 +#define EC_F_ECPKPARAMETERS_PRINT_FP 150 +#define EC_F_ECP_NIST_MOD_192 203 +#define EC_F_ECP_NIST_MOD_224 204 +#define EC_F_ECP_NIST_MOD_256 205 +#define EC_F_ECP_NIST_MOD_521 206 +#define EC_F_EC_ASN1_GROUP2CURVE 153 +#define EC_F_EC_ASN1_GROUP2FIELDID 154 +#define EC_F_EC_ASN1_GROUP2PARAMETERS 155 +#define EC_F_EC_ASN1_GROUP2PKPARAMETERS 156 +#define EC_F_EC_ASN1_PARAMETERS2GROUP 157 +#define EC_F_EC_ASN1_PKPARAMETERS2GROUP 158 +#define EC_F_EC_EX_DATA_SET_DATA 211 +#define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY 208 +#define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 159 +#define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE 195 +#define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 +#define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 +#define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162 +#define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 163 +#define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 164 +#define EC_F_EC_GFP_MONT_FIELD_DECODE 133 +#define EC_F_EC_GFP_MONT_FIELD_ENCODE 134 +#define EC_F_EC_GFP_MONT_FIELD_MUL 131 +#define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE 209 +#define EC_F_EC_GFP_MONT_FIELD_SQR 132 +#define EC_F_EC_GFP_MONT_GROUP_SET_CURVE 189 +#define EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP 135 +#define EC_F_EC_GFP_NIST_FIELD_MUL 200 +#define EC_F_EC_GFP_NIST_FIELD_SQR 201 +#define EC_F_EC_GFP_NIST_GROUP_SET_CURVE 202 +#define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 165 +#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 166 +#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP 100 +#define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR 101 +#define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE 102 +#define EC_F_EC_GFP_SIMPLE_OCT2POINT 103 +#define EC_F_EC_GFP_SIMPLE_POINT2OCT 104 +#define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE 137 +#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 167 +#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105 +#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 168 +#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128 +#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 169 +#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129 +#define EC_F_EC_GROUP_CHECK 170 +#define EC_F_EC_GROUP_CHECK_DISCRIMINANT 171 +#define EC_F_EC_GROUP_COPY 106 +#define EC_F_EC_GROUP_GET0_GENERATOR 139 +#define EC_F_EC_GROUP_GET_COFACTOR 140 +#define EC_F_EC_GROUP_GET_CURVE_GF2M 172 +#define EC_F_EC_GROUP_GET_CURVE_GFP 130 +#define EC_F_EC_GROUP_GET_DEGREE 173 +#define EC_F_EC_GROUP_GET_ORDER 141 +#define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS 193 +#define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 194 +#define EC_F_EC_GROUP_NEW 108 +#define EC_F_EC_GROUP_NEW_BY_CURVE_NAME 174 +#define EC_F_EC_GROUP_NEW_FROM_DATA 175 +#define EC_F_EC_GROUP_PRECOMPUTE_MULT 142 +#define EC_F_EC_GROUP_SET_CURVE_GF2M 176 +#define EC_F_EC_GROUP_SET_CURVE_GFP 109 +#define EC_F_EC_GROUP_SET_EXTRA_DATA 110 +#define EC_F_EC_GROUP_SET_GENERATOR 111 +#define EC_F_EC_KEY_CHECK_KEY 177 +#define EC_F_EC_KEY_COPY 178 +#define EC_F_EC_KEY_GENERATE_KEY 179 +#define EC_F_EC_KEY_NEW 182 +#define EC_F_EC_KEY_PRINT 180 +#define EC_F_EC_KEY_PRINT_FP 181 +#define EC_F_EC_POINTS_MAKE_AFFINE 136 +#define EC_F_EC_POINTS_MUL 138 +#define EC_F_EC_POINT_ADD 112 +#define EC_F_EC_POINT_CMP 113 +#define EC_F_EC_POINT_COPY 114 +#define EC_F_EC_POINT_DBL 115 +#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 183 +#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP 116 +#define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP 117 +#define EC_F_EC_POINT_INVERT 210 +#define EC_F_EC_POINT_IS_AT_INFINITY 118 +#define EC_F_EC_POINT_IS_ON_CURVE 119 +#define EC_F_EC_POINT_MAKE_AFFINE 120 +#define EC_F_EC_POINT_MUL 184 +#define EC_F_EC_POINT_NEW 121 +#define EC_F_EC_POINT_OCT2POINT 122 +#define EC_F_EC_POINT_POINT2OCT 123 +#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 185 +#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP 124 +#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 186 +#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP 125 +#define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP 126 +#define EC_F_EC_POINT_SET_TO_INFINITY 127 +#define EC_F_EC_PRE_COMP_DUP 207 +#define EC_F_EC_PRE_COMP_NEW 196 +#define EC_F_EC_WNAF_MUL 187 +#define EC_F_EC_WNAF_PRECOMPUTE_MULT 188 +#define EC_F_I2D_ECPARAMETERS 190 +#define EC_F_I2D_ECPKPARAMETERS 191 +#define EC_F_I2D_ECPRIVATEKEY 192 +#define EC_F_I2O_ECPUBLICKEY 151 +#define EC_F_O2I_ECPUBLICKEY 152 + +/* Reason codes. */ +#define EC_R_ASN1_ERROR 115 +#define EC_R_ASN1_UNKNOWN_FIELD 116 +#define EC_R_BUFFER_TOO_SMALL 100 +#define EC_R_D2I_ECPKPARAMETERS_FAILURE 117 +#define EC_R_DISCRIMINANT_IS_ZERO 118 +#define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 +#define EC_R_FIELD_TOO_LARGE 138 +#define EC_R_GROUP2PKPARAMETERS_FAILURE 120 +#define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 +#define EC_R_INCOMPATIBLE_OBJECTS 101 +#define EC_R_INVALID_ARGUMENT 112 +#define EC_R_INVALID_COMPRESSED_POINT 110 +#define EC_R_INVALID_COMPRESSION_BIT 109 +#define EC_R_INVALID_ENCODING 102 +#define EC_R_INVALID_FIELD 103 +#define EC_R_INVALID_FORM 104 +#define EC_R_INVALID_GROUP_ORDER 122 +#define EC_R_INVALID_PENTANOMIAL_BASIS 132 +#define EC_R_INVALID_PRIVATE_KEY 123 +#define EC_R_INVALID_TRINOMIAL_BASIS 137 +#define EC_R_MISSING_PARAMETERS 124 +#define EC_R_MISSING_PRIVATE_KEY 125 +#define EC_R_NOT_A_NIST_PRIME 135 +#define EC_R_NOT_A_SUPPORTED_NIST_PRIME 136 +#define EC_R_NOT_IMPLEMENTED 126 +#define EC_R_NOT_INITIALIZED 111 +#define EC_R_NO_FIELD_MOD 133 +#define EC_R_PASSED_NULL_PARAMETER 134 +#define EC_R_PKPARAMETERS2GROUP_FAILURE 127 +#define EC_R_POINT_AT_INFINITY 106 +#define EC_R_POINT_IS_NOT_ON_CURVE 107 +#define EC_R_SLOT_FULL 108 +#define EC_R_UNDEFINED_GENERATOR 113 +#define EC_R_UNDEFINED_ORDER 128 +#define EC_R_UNKNOWN_GROUP 129 +#define EC_R_UNKNOWN_ORDER 114 +#define EC_R_UNSUPPORTED_FIELD 131 +#define EC_R_WRONG_ORDER 130 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/ecdh.h b/mswin32/OpenSSL/include/openssl/ecdh.h new file mode 100755 index 000000000..b4b58ee65 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ecdh.h @@ -0,0 +1,123 @@ +/* crypto/ecdh/ecdh.h */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * The Elliptic Curve Public-Key Crypto Library (ECC Code) included + * herein is developed by SUN MICROSYSTEMS, INC., and is contributed + * to the OpenSSL project. + * + * The ECC Code is licensed pursuant to the OpenSSL open source + * license provided below. + * + * The ECDH software is originally written by Douglas Stebila of + * Sun Microsystems Laboratories. + * + */ +/* ==================================================================== + * Copyright (c) 2000-2002 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDH_H +#define HEADER_ECDH_H + +#include + +#ifdef OPENSSL_NO_ECDH +#error ECDH is disabled. +#endif + +#include +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +const ECDH_METHOD *ECDH_OpenSSL(void); + +void ECDH_set_default_method(const ECDH_METHOD *); +const ECDH_METHOD *ECDH_get_default_method(void); +int ECDH_set_method(EC_KEY *, const ECDH_METHOD *); + +int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh, + void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen)); + +int ECDH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new + *new_func, CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int ECDH_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDH_get_ex_data(EC_KEY *d, int idx); + + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ECDH_strings(void); + +/* Error codes for the ECDH functions. */ + +/* Function codes. */ +#define ECDH_F_ECDH_COMPUTE_KEY 100 +#define ECDH_F_ECDH_DATA_NEW_METHOD 101 + +/* Reason codes. */ +#define ECDH_R_KDF_FAILED 102 +#define ECDH_R_NO_PRIVATE_VALUE 100 +#define ECDH_R_POINT_ARITHMETIC_FAILURE 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/ecdsa.h b/mswin32/OpenSSL/include/openssl/ecdsa.h new file mode 100755 index 000000000..f20c8ee73 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ecdsa.h @@ -0,0 +1,271 @@ +/* crypto/ecdsa/ecdsa.h */ +/** + * \file crypto/ecdsa/ecdsa.h Include file for the OpenSSL ECDSA functions + * \author Written by Nils Larsch for the OpenSSL project + */ +/* ==================================================================== + * Copyright (c) 2000-2003 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDSA_H +#define HEADER_ECDSA_H + +#include + +#ifdef OPENSSL_NO_ECDSA +#error ECDSA is disabled. +#endif + +#include +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ECDSA_SIG_st + { + BIGNUM *r; + BIGNUM *s; + } ECDSA_SIG; + +/** ECDSA_SIG *ECDSA_SIG_new(void) + * allocates and initialize a ECDSA_SIG structure + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_SIG_new(void); + +/** ECDSA_SIG_free + * frees a ECDSA_SIG structure + * \param a pointer to the ECDSA_SIG structure + */ +void ECDSA_SIG_free(ECDSA_SIG *a); + +/** i2d_ECDSA_SIG + * DER encode content of ECDSA_SIG object (note: this function modifies *pp + * (*pp += length of the DER encoded signature)). + * \param a pointer to the ECDSA_SIG object + * \param pp pointer to a unsigned char pointer for the output or NULL + * \return the length of the DER encoded ECDSA_SIG object or 0 + */ +int i2d_ECDSA_SIG(const ECDSA_SIG *a, unsigned char **pp); + +/** d2i_ECDSA_SIG + * decodes a DER encoded ECDSA signature (note: this function changes *pp + * (*pp += len)). + * \param v pointer to ECDSA_SIG pointer (may be NULL) + * \param pp buffer with the DER encoded signature + * \param len bufferlength + * \return pointer to the decoded ECDSA_SIG structure (or NULL) + */ +ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **v, const unsigned char **pp, long len); + +/** ECDSA_do_sign + * computes the ECDSA signature of the given hash value using + * the supplied private key and returns the created signature. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param eckey pointer to the EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL + */ +ECDSA_SIG *ECDSA_do_sign(const unsigned char *dgst,int dgst_len,EC_KEY *eckey); + +/** ECDSA_do_sign_ex + * computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param kinv optional pointer to a pre-computed inverse k + * \param rp optional pointer to the pre-computed rp value (see + * ECDSA_sign_setup + * \param eckey pointer to the EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL + */ +ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *dgst, int dgstlen, + const BIGNUM *kinv, const BIGNUM *rp, EC_KEY *eckey); + +/** ECDSA_do_verify + * verifies that the supplied signature is a valid ECDSA + * signature of the supplied hash value using the supplied public key. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param sig pointer to the ECDSA_SIG structure + * \param eckey pointer to the EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid and -1 on error + */ +int ECDSA_do_verify(const unsigned char *dgst, int dgst_len, + const ECDSA_SIG *sig, EC_KEY* eckey); + +const ECDSA_METHOD *ECDSA_OpenSSL(void); + +/** ECDSA_set_default_method + * sets the default ECDSA method + * \param meth the new default ECDSA_METHOD + */ +void ECDSA_set_default_method(const ECDSA_METHOD *meth); + +/** ECDSA_get_default_method + * returns the default ECDSA method + * \return pointer to ECDSA_METHOD structure containing the default method + */ +const ECDSA_METHOD *ECDSA_get_default_method(void); + +/** ECDSA_set_method + * sets method to be used for the ECDSA operations + * \param eckey pointer to the EC_KEY object + * \param meth pointer to the new method + * \return 1 on success and 0 otherwise + */ +int ECDSA_set_method(EC_KEY *eckey, const ECDSA_METHOD *meth); + +/** ECDSA_size + * returns the maximum length of the DER encoded signature + * \param eckey pointer to a EC_KEY object + * \return numbers of bytes required for the DER encoded signature + */ +int ECDSA_size(const EC_KEY *eckey); + +/** ECDSA_sign_setup + * precompute parts of the signing operation. + * \param eckey pointer to the EC_KEY object containing a private EC key + * \param ctx pointer to a BN_CTX object (may be NULL) + * \param kinv pointer to a BIGNUM pointer for the inverse of k + * \param rp pointer to a BIGNUM pointer for x coordinate of k * generator + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_setup(EC_KEY *eckey, BN_CTX *ctx, BIGNUM **kinv, + BIGNUM **rp); + +/** ECDSA_sign + * computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig buffer to hold the DER encoded signature + * \param siglen pointer to the length of the returned signature + * \param eckey pointer to the EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, EC_KEY *eckey); + + +/** ECDSA_sign_ex + * computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig buffer to hold the DER encoded signature + * \param siglen pointer to the length of the returned signature + * \param kinv optional pointer to a pre-computed inverse k + * \param rp optional pointer to the pre-computed rp value (see + * ECDSA_sign_setup + * \param eckey pointer to the EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_ex(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, const BIGNUM *kinv, + const BIGNUM *rp, EC_KEY *eckey); + +/** ECDSA_verify + * verifies that the given signature is valid ECDSA signature + * of the supplied hash value using the specified public key. + * \param type this parameter is ignored + * \param dgst pointer to the hash value + * \param dgstlen length of the hash value + * \param sig pointer to the DER encoded signature + * \param siglen length of the DER encoded signature + * \param eckey pointer to the EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid and -1 on error + */ +int ECDSA_verify(int type, const unsigned char *dgst, int dgstlen, + const unsigned char *sig, int siglen, EC_KEY *eckey); + +/* the standard ex_data functions */ +int ECDSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new + *new_func, CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int ECDSA_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDSA_get_ex_data(EC_KEY *d, int idx); + + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ECDSA_strings(void); + +/* Error codes for the ECDSA functions. */ + +/* Function codes. */ +#define ECDSA_F_ECDSA_DATA_NEW_METHOD 100 +#define ECDSA_F_ECDSA_DO_SIGN 101 +#define ECDSA_F_ECDSA_DO_VERIFY 102 +#define ECDSA_F_ECDSA_SIGN_SETUP 103 + +/* Reason codes. */ +#define ECDSA_R_BAD_SIGNATURE 100 +#define ECDSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 101 +#define ECDSA_R_ERR_EC_LIB 102 +#define ECDSA_R_MISSING_PARAMETERS 103 +#define ECDSA_R_NEED_NEW_SETUP_VALUES 106 +#define ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED 104 +#define ECDSA_R_SIGNATURE_MALLOC_FAILED 105 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/engine.h b/mswin32/OpenSSL/include/openssl/engine.h new file mode 100755 index 000000000..3ec59338f --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/engine.h @@ -0,0 +1,785 @@ +/* openssl/engine.h */ +/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL + * project 2000. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_ENGINE_H +#define HEADER_ENGINE_H + +#include + +#ifdef OPENSSL_NO_ENGINE +#error ENGINE is disabled. +#endif + +#ifndef OPENSSL_NO_DEPRECATED +#include +#ifndef OPENSSL_NO_RSA +#include +#endif +#ifndef OPENSSL_NO_DSA +#include +#endif +#ifndef OPENSSL_NO_DH +#include +#endif +#ifndef OPENSSL_NO_ECDH +#include +#endif +#ifndef OPENSSL_NO_ECDSA +#include +#endif +#include +#include +#include +#include +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* These flags are used to control combinations of algorithm (methods) + * by bitwise "OR"ing. */ +#define ENGINE_METHOD_RSA (unsigned int)0x0001 +#define ENGINE_METHOD_DSA (unsigned int)0x0002 +#define ENGINE_METHOD_DH (unsigned int)0x0004 +#define ENGINE_METHOD_RAND (unsigned int)0x0008 +#define ENGINE_METHOD_ECDH (unsigned int)0x0010 +#define ENGINE_METHOD_ECDSA (unsigned int)0x0020 +#define ENGINE_METHOD_CIPHERS (unsigned int)0x0040 +#define ENGINE_METHOD_DIGESTS (unsigned int)0x0080 +#define ENGINE_METHOD_STORE (unsigned int)0x0100 +/* Obvious all-or-nothing cases. */ +#define ENGINE_METHOD_ALL (unsigned int)0xFFFF +#define ENGINE_METHOD_NONE (unsigned int)0x0000 + +/* This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used + * internally to control registration of ENGINE implementations, and can be set + * by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to + * initialise registered ENGINEs if they are not already initialised. */ +#define ENGINE_TABLE_FLAG_NOINIT (unsigned int)0x0001 + +/* ENGINE flags that can be set by ENGINE_set_flags(). */ +/* #define ENGINE_FLAGS_MALLOCED 0x0001 */ /* Not used */ + +/* This flag is for ENGINEs that wish to handle the various 'CMD'-related + * control commands on their own. Without this flag, ENGINE_ctrl() handles these + * control commands on behalf of the ENGINE using their "cmd_defns" data. */ +#define ENGINE_FLAGS_MANUAL_CMD_CTRL (int)0x0002 + +/* This flag is for ENGINEs who return new duplicate structures when found via + * "ENGINE_by_id()". When an ENGINE must store state (eg. if ENGINE_ctrl() + * commands are called in sequence as part of some stateful process like + * key-generation setup and execution), it can set this flag - then each attempt + * to obtain the ENGINE will result in it being copied into a new structure. + * Normally, ENGINEs don't declare this flag so ENGINE_by_id() just increments + * the existing ENGINE's structural reference count. */ +#define ENGINE_FLAGS_BY_ID_COPY (int)0x0004 + +/* ENGINEs can support their own command types, and these flags are used in + * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input each + * command expects. Currently only numeric and string input is supported. If a + * control command supports none of the _NUMERIC, _STRING, or _NO_INPUT options, + * then it is regarded as an "internal" control command - and not for use in + * config setting situations. As such, they're not available to the + * ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() access. Changes to + * this list of 'command types' should be reflected carefully in + * ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). */ + +/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */ +#define ENGINE_CMD_FLAG_NUMERIC (unsigned int)0x0001 +/* accepts string input (cast from 'void*' to 'const char *', 4th parameter to + * ENGINE_ctrl) */ +#define ENGINE_CMD_FLAG_STRING (unsigned int)0x0002 +/* Indicates that the control command takes *no* input. Ie. the control command + * is unparameterised. */ +#define ENGINE_CMD_FLAG_NO_INPUT (unsigned int)0x0004 +/* Indicates that the control command is internal. This control command won't + * be shown in any output, and is only usable through the ENGINE_ctrl_cmd() + * function. */ +#define ENGINE_CMD_FLAG_INTERNAL (unsigned int)0x0008 + +/* NB: These 3 control commands are deprecated and should not be used. ENGINEs + * relying on these commands should compile conditional support for + * compatibility (eg. if these symbols are defined) but should also migrate the + * same functionality to their own ENGINE-specific control functions that can be + * "discovered" by calling applications. The fact these control commands + * wouldn't be "executable" (ie. usable by text-based config) doesn't change the + * fact that application code can find and use them without requiring per-ENGINE + * hacking. */ + +/* These flags are used to tell the ctrl function what should be done. + * All command numbers are shared between all engines, even if some don't + * make sense to some engines. In such a case, they do nothing but return + * the error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. */ +#define ENGINE_CTRL_SET_LOGSTREAM 1 +#define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2 +#define ENGINE_CTRL_HUP 3 /* Close and reinitialise any + handles/connections etc. */ +#define ENGINE_CTRL_SET_USER_INTERFACE 4 /* Alternative to callback */ +#define ENGINE_CTRL_SET_CALLBACK_DATA 5 /* User-specific data, used + when calling the password + callback and the user + interface */ +#define ENGINE_CTRL_LOAD_CONFIGURATION 6 /* Load a configuration, given + a string that represents a + file name or so */ +#define ENGINE_CTRL_LOAD_SECTION 7 /* Load data from a given + section in the already loaded + configuration */ + +/* These control commands allow an application to deal with an arbitrary engine + * in a dynamic way. Warn: Negative return values indicate errors FOR THESE + * COMMANDS because zero is used to indicate 'end-of-list'. Other commands, + * including ENGINE-specific command types, return zero for an error. + * + * An ENGINE can choose to implement these ctrl functions, and can internally + * manage things however it chooses - it does so by setting the + * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise the + * ENGINE_ctrl() code handles this on the ENGINE's behalf using the cmd_defns + * data (set using ENGINE_set_cmd_defns()). This means an ENGINE's ctrl() + * handler need only implement its own commands - the above "meta" commands will + * be taken care of. */ + +/* Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", then + * all the remaining control commands will return failure, so it is worth + * checking this first if the caller is trying to "discover" the engine's + * capabilities and doesn't want errors generated unnecessarily. */ +#define ENGINE_CTRL_HAS_CTRL_FUNCTION 10 +/* Returns a positive command number for the first command supported by the + * engine. Returns zero if no ctrl commands are supported. */ +#define ENGINE_CTRL_GET_FIRST_CMD_TYPE 11 +/* The 'long' argument specifies a command implemented by the engine, and the + * return value is the next command supported, or zero if there are no more. */ +#define ENGINE_CTRL_GET_NEXT_CMD_TYPE 12 +/* The 'void*' argument is a command name (cast from 'const char *'), and the + * return value is the command that corresponds to it. */ +#define ENGINE_CTRL_GET_CMD_FROM_NAME 13 +/* The next two allow a command to be converted into its corresponding string + * form. In each case, the 'long' argument supplies the command. In the NAME_LEN + * case, the return value is the length of the command name (not counting a + * trailing EOL). In the NAME case, the 'void*' argument must be a string buffer + * large enough, and it will be populated with the name of the command (WITH a + * trailing EOL). */ +#define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD 14 +#define ENGINE_CTRL_GET_NAME_FROM_CMD 15 +/* The next two are similar but give a "short description" of a command. */ +#define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD 16 +#define ENGINE_CTRL_GET_DESC_FROM_CMD 17 +/* With this command, the return value is the OR'd combination of + * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given + * engine-specific ctrl command expects. */ +#define ENGINE_CTRL_GET_CMD_FLAGS 18 + +/* ENGINE implementations should start the numbering of their own control + * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). */ +#define ENGINE_CMD_BASE 200 + +/* NB: These 2 nCipher "chil" control commands are deprecated, and their + * functionality is now available through ENGINE-specific control commands + * (exposed through the above-mentioned 'CMD'-handling). Code using these 2 + * commands should be migrated to the more general command handling before these + * are removed. */ + +/* Flags specific to the nCipher "chil" engine */ +#define ENGINE_CTRL_CHIL_SET_FORKCHECK 100 + /* Depending on the value of the (long)i argument, this sets or + * unsets the SimpleForkCheck flag in the CHIL API to enable or + * disable checking and workarounds for applications that fork(). + */ +#define ENGINE_CTRL_CHIL_NO_LOCKING 101 + /* This prevents the initialisation function from providing mutex + * callbacks to the nCipher library. */ + +/* If an ENGINE supports its own specific control commands and wishes the + * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on its + * behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN entries + * to ENGINE_set_cmd_defns(). It should also implement a ctrl() handler that + * supports the stated commands (ie. the "cmd_num" entries as described by the + * array). NB: The array must be ordered in increasing order of cmd_num. + * "null-terminated" means that the last ENGINE_CMD_DEFN element has cmd_num set + * to zero and/or cmd_name set to NULL. */ +typedef struct ENGINE_CMD_DEFN_st + { + unsigned int cmd_num; /* The command number */ + const char *cmd_name; /* The command name itself */ + const char *cmd_desc; /* A short description of the command */ + unsigned int cmd_flags; /* The input the command expects */ + } ENGINE_CMD_DEFN; + +/* Generic function pointer */ +typedef int (*ENGINE_GEN_FUNC_PTR)(void); +/* Generic function pointer taking no arguments */ +typedef int (*ENGINE_GEN_INT_FUNC_PTR)(ENGINE *); +/* Specific control function pointer */ +typedef int (*ENGINE_CTRL_FUNC_PTR)(ENGINE *, int, long, void *, void (*f)(void)); +/* Generic load_key function pointer */ +typedef EVP_PKEY * (*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *, + UI_METHOD *ui_method, void *callback_data); +/* These callback types are for an ENGINE's handler for cipher and digest logic. + * These handlers have these prototypes; + * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid); + * int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid); + * Looking at how to implement these handlers in the case of cipher support, if + * the framework wants the EVP_CIPHER for 'nid', it will call; + * foo(e, &p_evp_cipher, NULL, nid); (return zero for failure) + * If the framework wants a list of supported 'nid's, it will call; + * foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error) + */ +/* Returns to a pointer to the array of supported cipher 'nid's. If the second + * parameter is non-NULL it is set to the size of the returned array. */ +typedef int (*ENGINE_CIPHERS_PTR)(ENGINE *, const EVP_CIPHER **, const int **, int); +typedef int (*ENGINE_DIGESTS_PTR)(ENGINE *, const EVP_MD **, const int **, int); + +/* STRUCTURE functions ... all of these functions deal with pointers to ENGINE + * structures where the pointers have a "structural reference". This means that + * their reference is to allowed access to the structure but it does not imply + * that the structure is functional. To simply increment or decrement the + * structural reference count, use ENGINE_by_id and ENGINE_free. NB: This is not + * required when iterating using ENGINE_get_next as it will automatically + * decrement the structural reference count of the "current" ENGINE and + * increment the structural reference count of the ENGINE it returns (unless it + * is NULL). */ + +/* Get the first/last "ENGINE" type available. */ +ENGINE *ENGINE_get_first(void); +ENGINE *ENGINE_get_last(void); +/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */ +ENGINE *ENGINE_get_next(ENGINE *e); +ENGINE *ENGINE_get_prev(ENGINE *e); +/* Add another "ENGINE" type into the array. */ +int ENGINE_add(ENGINE *e); +/* Remove an existing "ENGINE" type from the array. */ +int ENGINE_remove(ENGINE *e); +/* Retrieve an engine from the list by its unique "id" value. */ +ENGINE *ENGINE_by_id(const char *id); +/* Add all the built-in engines. */ +void ENGINE_load_openssl(void); +void ENGINE_load_dynamic(void); +#ifndef OPENSSL_NO_STATIC_ENGINE +void ENGINE_load_4758cca(void); +void ENGINE_load_aep(void); +void ENGINE_load_atalla(void); +void ENGINE_load_chil(void); +void ENGINE_load_cswift(void); +#ifndef OPENSSL_NO_GMP +void ENGINE_load_gmp(void); +#endif +void ENGINE_load_nuron(void); +void ENGINE_load_sureware(void); +void ENGINE_load_ubsec(void); +#endif +void ENGINE_load_cryptodev(void); +void ENGINE_load_padlock(void); +void ENGINE_load_builtin_engines(void); + +/* Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation + * "registry" handling. */ +unsigned int ENGINE_get_table_flags(void); +void ENGINE_set_table_flags(unsigned int flags); + +/* Manage registration of ENGINEs per "table". For each type, there are 3 + * functions; + * ENGINE_register_***(e) - registers the implementation from 'e' (if it has one) + * ENGINE_unregister_***(e) - unregister the implementation from 'e' + * ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list + * Cleanup is automatically registered from each table when required, so + * ENGINE_cleanup() will reverse any "register" operations. */ + +int ENGINE_register_RSA(ENGINE *e); +void ENGINE_unregister_RSA(ENGINE *e); +void ENGINE_register_all_RSA(void); + +int ENGINE_register_DSA(ENGINE *e); +void ENGINE_unregister_DSA(ENGINE *e); +void ENGINE_register_all_DSA(void); + +int ENGINE_register_ECDH(ENGINE *e); +void ENGINE_unregister_ECDH(ENGINE *e); +void ENGINE_register_all_ECDH(void); + +int ENGINE_register_ECDSA(ENGINE *e); +void ENGINE_unregister_ECDSA(ENGINE *e); +void ENGINE_register_all_ECDSA(void); + +int ENGINE_register_DH(ENGINE *e); +void ENGINE_unregister_DH(ENGINE *e); +void ENGINE_register_all_DH(void); + +int ENGINE_register_RAND(ENGINE *e); +void ENGINE_unregister_RAND(ENGINE *e); +void ENGINE_register_all_RAND(void); + +int ENGINE_register_STORE(ENGINE *e); +void ENGINE_unregister_STORE(ENGINE *e); +void ENGINE_register_all_STORE(void); + +int ENGINE_register_ciphers(ENGINE *e); +void ENGINE_unregister_ciphers(ENGINE *e); +void ENGINE_register_all_ciphers(void); + +int ENGINE_register_digests(ENGINE *e); +void ENGINE_unregister_digests(ENGINE *e); +void ENGINE_register_all_digests(void); + +/* These functions register all support from the above categories. Note, use of + * these functions can result in static linkage of code your application may not + * need. If you only need a subset of functionality, consider using more + * selective initialisation. */ +int ENGINE_register_complete(ENGINE *e); +int ENGINE_register_all_complete(void); + +/* Send parametrised control commands to the engine. The possibilities to send + * down an integer, a pointer to data or a function pointer are provided. Any of + * the parameters may or may not be NULL, depending on the command number. In + * actuality, this function only requires a structural (rather than functional) + * reference to an engine, but many control commands may require the engine be + * functional. The caller should be aware of trying commands that require an + * operational ENGINE, and only use functional references in such situations. */ +int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void)); + +/* This function tests if an ENGINE-specific command is usable as a "setting". + * Eg. in an application's config file that gets processed through + * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to + * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). */ +int ENGINE_cmd_is_executable(ENGINE *e, int cmd); + +/* This function works like ENGINE_ctrl() with the exception of taking a + * command name instead of a command number, and can handle optional commands. + * See the comment on ENGINE_ctrl_cmd_string() for an explanation on how to + * use the cmd_name and cmd_optional. */ +int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name, + long i, void *p, void (*f)(void), int cmd_optional); + +/* This function passes a command-name and argument to an ENGINE. The cmd_name + * is converted to a command number and the control command is called using + * 'arg' as an argument (unless the ENGINE doesn't support such a command, in + * which case no control command is called). The command is checked for input + * flags, and if necessary the argument will be converted to a numeric value. If + * cmd_optional is non-zero, then if the ENGINE doesn't support the given + * cmd_name the return value will be success anyway. This function is intended + * for applications to use so that users (or config files) can supply + * engine-specific config data to the ENGINE at run-time to control behaviour of + * specific engines. As such, it shouldn't be used for calling ENGINE_ctrl() + * functions that return data, deal with binary data, or that are otherwise + * supposed to be used directly through ENGINE_ctrl() in application code. Any + * "return" data from an ENGINE_ctrl() operation in this function will be lost - + * the return value is interpreted as failure if the return value is zero, + * success otherwise, and this function returns a boolean value as a result. In + * other words, vendors of 'ENGINE'-enabled devices should write ENGINE + * implementations with parameterisations that work in this scheme, so that + * compliant ENGINE-based applications can work consistently with the same + * configuration for the same ENGINE-enabled devices, across applications. */ +int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg, + int cmd_optional); + +/* These functions are useful for manufacturing new ENGINE structures. They + * don't address reference counting at all - one uses them to populate an ENGINE + * structure with personalised implementations of things prior to using it + * directly or adding it to the builtin ENGINE list in OpenSSL. These are also + * here so that the ENGINE structure doesn't have to be exposed and break binary + * compatibility! */ +ENGINE *ENGINE_new(void); +int ENGINE_free(ENGINE *e); +int ENGINE_up_ref(ENGINE *e); +int ENGINE_set_id(ENGINE *e, const char *id); +int ENGINE_set_name(ENGINE *e, const char *name); +int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth); +int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth); +int ENGINE_set_ECDH(ENGINE *e, const ECDH_METHOD *ecdh_meth); +int ENGINE_set_ECDSA(ENGINE *e, const ECDSA_METHOD *ecdsa_meth); +int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth); +int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth); +int ENGINE_set_STORE(ENGINE *e, const STORE_METHOD *store_meth); +int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f); +int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f); +int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f); +int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f); +int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f); +int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f); +int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f); +int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f); +int ENGINE_set_flags(ENGINE *e, int flags); +int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns); +/* These functions allow control over any per-structure ENGINE data. */ +int ENGINE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg); +void *ENGINE_get_ex_data(const ENGINE *e, int idx); + +/* This function cleans up anything that needs it. Eg. the ENGINE_add() function + * automatically ensures the list cleanup function is registered to be called + * from ENGINE_cleanup(). Similarly, all ENGINE_register_*** functions ensure + * ENGINE_cleanup() will clean up after them. */ +void ENGINE_cleanup(void); + +/* These return values from within the ENGINE structure. These can be useful + * with functional references as well as structural references - it depends + * which you obtained. Using the result for functional purposes if you only + * obtained a structural reference may be problematic! */ +const char *ENGINE_get_id(const ENGINE *e); +const char *ENGINE_get_name(const ENGINE *e); +const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e); +const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e); +const ECDH_METHOD *ENGINE_get_ECDH(const ENGINE *e); +const ECDSA_METHOD *ENGINE_get_ECDSA(const ENGINE *e); +const DH_METHOD *ENGINE_get_DH(const ENGINE *e); +const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e); +const STORE_METHOD *ENGINE_get_STORE(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e); +ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e); +ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e); +ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e); +const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid); +const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid); +const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e); +int ENGINE_get_flags(const ENGINE *e); + +/* FUNCTIONAL functions. These functions deal with ENGINE structures + * that have (or will) be initialised for use. Broadly speaking, the + * structural functions are useful for iterating the list of available + * engine types, creating new engine types, and other "list" operations. + * These functions actually deal with ENGINEs that are to be used. As + * such these functions can fail (if applicable) when particular + * engines are unavailable - eg. if a hardware accelerator is not + * attached or not functioning correctly. Each ENGINE has 2 reference + * counts; structural and functional. Every time a functional reference + * is obtained or released, a corresponding structural reference is + * automatically obtained or released too. */ + +/* Initialise a engine type for use (or up its reference count if it's + * already in use). This will fail if the engine is not currently + * operational and cannot initialise. */ +int ENGINE_init(ENGINE *e); +/* Free a functional reference to a engine type. This does not require + * a corresponding call to ENGINE_free as it also releases a structural + * reference. */ +int ENGINE_finish(ENGINE *e); + +/* The following functions handle keys that are stored in some secondary + * location, handled by the engine. The storage may be on a card or + * whatever. */ +EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); + +/* This returns a pointer for the current ENGINE structure that + * is (by default) performing any RSA operations. The value returned + * is an incremented reference, so it should be free'd (ENGINE_finish) + * before it is discarded. */ +ENGINE *ENGINE_get_default_RSA(void); +/* Same for the other "methods" */ +ENGINE *ENGINE_get_default_DSA(void); +ENGINE *ENGINE_get_default_ECDH(void); +ENGINE *ENGINE_get_default_ECDSA(void); +ENGINE *ENGINE_get_default_DH(void); +ENGINE *ENGINE_get_default_RAND(void); +/* These functions can be used to get a functional reference to perform + * ciphering or digesting corresponding to "nid". */ +ENGINE *ENGINE_get_cipher_engine(int nid); +ENGINE *ENGINE_get_digest_engine(int nid); + +/* This sets a new default ENGINE structure for performing RSA + * operations. If the result is non-zero (success) then the ENGINE + * structure will have had its reference count up'd so the caller + * should still free their own reference 'e'. */ +int ENGINE_set_default_RSA(ENGINE *e); +int ENGINE_set_default_string(ENGINE *e, const char *def_list); +/* Same for the other "methods" */ +int ENGINE_set_default_DSA(ENGINE *e); +int ENGINE_set_default_ECDH(ENGINE *e); +int ENGINE_set_default_ECDSA(ENGINE *e); +int ENGINE_set_default_DH(ENGINE *e); +int ENGINE_set_default_RAND(ENGINE *e); +int ENGINE_set_default_ciphers(ENGINE *e); +int ENGINE_set_default_digests(ENGINE *e); + +/* The combination "set" - the flags are bitwise "OR"d from the + * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()" + * function, this function can result in unnecessary static linkage. If your + * application requires only specific functionality, consider using more + * selective functions. */ +int ENGINE_set_default(ENGINE *e, unsigned int flags); + +void ENGINE_add_conf_module(void); + +/* Deprecated functions ... */ +/* int ENGINE_clear_defaults(void); */ + +/**************************/ +/* DYNAMIC ENGINE SUPPORT */ +/**************************/ + +/* Binary/behaviour compatibility levels */ +#define OSSL_DYNAMIC_VERSION (unsigned long)0x00020000 +/* Binary versions older than this are too old for us (whether we're a loader or + * a loadee) */ +#define OSSL_DYNAMIC_OLDEST (unsigned long)0x00020000 + +/* When compiling an ENGINE entirely as an external shared library, loadable by + * the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' structure + * type provides the calling application's (or library's) error functionality + * and memory management function pointers to the loaded library. These should + * be used/set in the loaded library code so that the loading application's + * 'state' will be used/changed in all operations. The 'static_state' pointer + * allows the loaded library to know if it shares the same static data as the + * calling application (or library), and thus whether these callbacks need to be + * set or not. */ +typedef void *(*dyn_MEM_malloc_cb)(size_t); +typedef void *(*dyn_MEM_realloc_cb)(void *, size_t); +typedef void (*dyn_MEM_free_cb)(void *); +typedef struct st_dynamic_MEM_fns { + dyn_MEM_malloc_cb malloc_cb; + dyn_MEM_realloc_cb realloc_cb; + dyn_MEM_free_cb free_cb; + } dynamic_MEM_fns; +/* FIXME: Perhaps the memory and locking code (crypto.h) should declare and use + * these types so we (and any other dependant code) can simplify a bit?? */ +typedef void (*dyn_lock_locking_cb)(int,int,const char *,int); +typedef int (*dyn_lock_add_lock_cb)(int*,int,int,const char *,int); +typedef struct CRYPTO_dynlock_value *(*dyn_dynlock_create_cb)( + const char *,int); +typedef void (*dyn_dynlock_lock_cb)(int,struct CRYPTO_dynlock_value *, + const char *,int); +typedef void (*dyn_dynlock_destroy_cb)(struct CRYPTO_dynlock_value *, + const char *,int); +typedef struct st_dynamic_LOCK_fns { + dyn_lock_locking_cb lock_locking_cb; + dyn_lock_add_lock_cb lock_add_lock_cb; + dyn_dynlock_create_cb dynlock_create_cb; + dyn_dynlock_lock_cb dynlock_lock_cb; + dyn_dynlock_destroy_cb dynlock_destroy_cb; + } dynamic_LOCK_fns; +/* The top-level structure */ +typedef struct st_dynamic_fns { + void *static_state; + const ERR_FNS *err_fns; + const CRYPTO_EX_DATA_IMPL *ex_data_fns; + dynamic_MEM_fns mem_fns; + dynamic_LOCK_fns lock_fns; + } dynamic_fns; + +/* The version checking function should be of this prototype. NB: The + * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading code. + * If this function returns zero, it indicates a (potential) version + * incompatibility and the loaded library doesn't believe it can proceed. + * Otherwise, the returned value is the (latest) version supported by the + * loading library. The loader may still decide that the loaded code's version + * is unsatisfactory and could veto the load. The function is expected to + * be implemented with the symbol name "v_check", and a default implementation + * can be fully instantiated with IMPLEMENT_DYNAMIC_CHECK_FN(). */ +typedef unsigned long (*dynamic_v_check_fn)(unsigned long ossl_version); +#define IMPLEMENT_DYNAMIC_CHECK_FN() \ + OPENSSL_EXPORT unsigned long v_check(unsigned long v) { \ + if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \ + return 0; } + +/* This function is passed the ENGINE structure to initialise with its own + * function and command settings. It should not adjust the structural or + * functional reference counts. If this function returns zero, (a) the load will + * be aborted, (b) the previous ENGINE state will be memcpy'd back onto the + * structure, and (c) the shared library will be unloaded. So implementations + * should do their own internal cleanup in failure circumstances otherwise they + * could leak. The 'id' parameter, if non-NULL, represents the ENGINE id that + * the loader is looking for. If this is NULL, the shared library can choose to + * return failure or to initialise a 'default' ENGINE. If non-NULL, the shared + * library must initialise only an ENGINE matching the passed 'id'. The function + * is expected to be implemented with the symbol name "bind_engine". A standard + * implementation can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where + * the parameter 'fn' is a callback function that populates the ENGINE structure + * and returns an int value (zero for failure). 'fn' should have prototype; + * [static] int fn(ENGINE *e, const char *id); */ +typedef int (*dynamic_bind_engine)(ENGINE *e, const char *id, + const dynamic_fns *fns); +#define IMPLEMENT_DYNAMIC_BIND_FN(fn) \ + OPENSSL_EXPORT \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \ + if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \ + if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \ + fns->mem_fns.realloc_cb, fns->mem_fns.free_cb)) \ + return 0; \ + CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \ + CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \ + CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb); \ + CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb); \ + CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb); \ + if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns)) \ + return 0; \ + if(!ERR_set_implementation(fns->err_fns)) return 0; \ + skip_cbs: \ + if(!fn(e,id)) return 0; \ + return 1; } + +/* If the loading application (or library) and the loaded ENGINE library share + * the same static data (eg. they're both dynamically linked to the same + * libcrypto.so) we need a way to avoid trying to set system callbacks - this + * would fail, and for the same reason that it's unnecessary to try. If the + * loaded ENGINE has (or gets from through the loader) its own copy of the + * libcrypto static data, we will need to set the callbacks. The easiest way to + * detect this is to have a function that returns a pointer to some static data + * and let the loading application and loaded ENGINE compare their respective + * values. */ +void *ENGINE_get_static_state(void); + +#if defined(__OpenBSD__) || defined(__FreeBSD__) +void ENGINE_setup_bsd_cryptodev(void); +#endif + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_ENGINE_strings(void); + +/* Error codes for the ENGINE functions. */ + +/* Function codes. */ +#define ENGINE_F_DYNAMIC_CTRL 180 +#define ENGINE_F_DYNAMIC_GET_DATA_CTX 181 +#define ENGINE_F_DYNAMIC_LOAD 182 +#define ENGINE_F_DYNAMIC_SET_DATA_CTX 183 +#define ENGINE_F_ENGINE_ADD 105 +#define ENGINE_F_ENGINE_BY_ID 106 +#define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE 170 +#define ENGINE_F_ENGINE_CTRL 142 +#define ENGINE_F_ENGINE_CTRL_CMD 178 +#define ENGINE_F_ENGINE_CTRL_CMD_STRING 171 +#define ENGINE_F_ENGINE_FINISH 107 +#define ENGINE_F_ENGINE_FREE_UTIL 108 +#define ENGINE_F_ENGINE_GET_CIPHER 185 +#define ENGINE_F_ENGINE_GET_DEFAULT_TYPE 177 +#define ENGINE_F_ENGINE_GET_DIGEST 186 +#define ENGINE_F_ENGINE_GET_NEXT 115 +#define ENGINE_F_ENGINE_GET_PREV 116 +#define ENGINE_F_ENGINE_INIT 119 +#define ENGINE_F_ENGINE_LIST_ADD 120 +#define ENGINE_F_ENGINE_LIST_REMOVE 121 +#define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150 +#define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151 +#define ENGINE_F_ENGINE_NEW 122 +#define ENGINE_F_ENGINE_REMOVE 123 +#define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189 +#define ENGINE_F_ENGINE_SET_DEFAULT_TYPE 126 +#define ENGINE_F_ENGINE_SET_ID 129 +#define ENGINE_F_ENGINE_SET_NAME 130 +#define ENGINE_F_ENGINE_TABLE_REGISTER 184 +#define ENGINE_F_ENGINE_UNLOAD_KEY 152 +#define ENGINE_F_ENGINE_UNLOCKED_FINISH 191 +#define ENGINE_F_ENGINE_UP_REF 190 +#define ENGINE_F_INT_CTRL_HELPER 172 +#define ENGINE_F_INT_ENGINE_CONFIGURE 188 +#define ENGINE_F_INT_ENGINE_MODULE_INIT 187 +#define ENGINE_F_LOG_MESSAGE 141 + +/* Reason codes. */ +#define ENGINE_R_ALREADY_LOADED 100 +#define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER 133 +#define ENGINE_R_CMD_NOT_EXECUTABLE 134 +#define ENGINE_R_COMMAND_TAKES_INPUT 135 +#define ENGINE_R_COMMAND_TAKES_NO_INPUT 136 +#define ENGINE_R_CONFLICTING_ENGINE_ID 103 +#define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED 119 +#define ENGINE_R_DH_NOT_IMPLEMENTED 139 +#define ENGINE_R_DSA_NOT_IMPLEMENTED 140 +#define ENGINE_R_DSO_FAILURE 104 +#define ENGINE_R_DSO_NOT_FOUND 132 +#define ENGINE_R_ENGINES_SECTION_ERROR 148 +#define ENGINE_R_ENGINE_IS_NOT_IN_LIST 105 +#define ENGINE_R_ENGINE_SECTION_ERROR 149 +#define ENGINE_R_FAILED_LOADING_PRIVATE_KEY 128 +#define ENGINE_R_FAILED_LOADING_PUBLIC_KEY 129 +#define ENGINE_R_FINISH_FAILED 106 +#define ENGINE_R_GET_HANDLE_FAILED 107 +#define ENGINE_R_ID_OR_NAME_MISSING 108 +#define ENGINE_R_INIT_FAILED 109 +#define ENGINE_R_INTERNAL_LIST_ERROR 110 +#define ENGINE_R_INVALID_ARGUMENT 143 +#define ENGINE_R_INVALID_CMD_NAME 137 +#define ENGINE_R_INVALID_CMD_NUMBER 138 +#define ENGINE_R_INVALID_INIT_VALUE 151 +#define ENGINE_R_INVALID_STRING 150 +#define ENGINE_R_NOT_INITIALISED 117 +#define ENGINE_R_NOT_LOADED 112 +#define ENGINE_R_NO_CONTROL_FUNCTION 120 +#define ENGINE_R_NO_INDEX 144 +#define ENGINE_R_NO_LOAD_FUNCTION 125 +#define ENGINE_R_NO_REFERENCE 130 +#define ENGINE_R_NO_SUCH_ENGINE 116 +#define ENGINE_R_NO_UNLOAD_FUNCTION 126 +#define ENGINE_R_PROVIDE_PARAMETERS 113 +#define ENGINE_R_RSA_NOT_IMPLEMENTED 141 +#define ENGINE_R_UNIMPLEMENTED_CIPHER 146 +#define ENGINE_R_UNIMPLEMENTED_DIGEST 147 +#define ENGINE_R_VERSION_INCOMPATIBILITY 145 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/err.h b/mswin32/OpenSSL/include/openssl/err.h new file mode 100755 index 000000000..b723cd977 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/err.h @@ -0,0 +1,318 @@ +/* crypto/err/err.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.] + */ + +#ifndef HEADER_ERR_H +#define HEADER_ERR_H + +#include + +#ifndef OPENSSL_NO_FP_API +#include +#include +#endif + +#include +#ifndef OPENSSL_NO_BIO +#include +#endif +#ifndef OPENSSL_NO_LHASH +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef OPENSSL_NO_ERR +#define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,d,e) +#else +#define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,NULL,0) +#endif + +#include + +#define ERR_TXT_MALLOCED 0x01 +#define ERR_TXT_STRING 0x02 + +#define ERR_FLAG_MARK 0x01 + +#define ERR_NUM_ERRORS 16 +typedef struct err_state_st + { + unsigned long pid; + int err_flags[ERR_NUM_ERRORS]; + unsigned long err_buffer[ERR_NUM_ERRORS]; + char *err_data[ERR_NUM_ERRORS]; + int err_data_flags[ERR_NUM_ERRORS]; + const char *err_file[ERR_NUM_ERRORS]; + int err_line[ERR_NUM_ERRORS]; + int top,bottom; + } ERR_STATE; + +/* library */ +#define ERR_LIB_NONE 1 +#define ERR_LIB_SYS 2 +#define ERR_LIB_BN 3 +#define ERR_LIB_RSA 4 +#define ERR_LIB_DH 5 +#define ERR_LIB_EVP 6 +#define ERR_LIB_BUF 7 +#define ERR_LIB_OBJ 8 +#define ERR_LIB_PEM 9 +#define ERR_LIB_DSA 10 +#define ERR_LIB_X509 11 +/* #define ERR_LIB_METH 12 */ +#define ERR_LIB_ASN1 13 +#define ERR_LIB_CONF 14 +#define ERR_LIB_CRYPTO 15 +#define ERR_LIB_EC 16 +#define ERR_LIB_SSL 20 +/* #define ERR_LIB_SSL23 21 */ +/* #define ERR_LIB_SSL2 22 */ +/* #define ERR_LIB_SSL3 23 */ +/* #define ERR_LIB_RSAREF 30 */ +/* #define ERR_LIB_PROXY 31 */ +#define ERR_LIB_BIO 32 +#define ERR_LIB_PKCS7 33 +#define ERR_LIB_X509V3 34 +#define ERR_LIB_PKCS12 35 +#define ERR_LIB_RAND 36 +#define ERR_LIB_DSO 37 +#define ERR_LIB_ENGINE 38 +#define ERR_LIB_OCSP 39 +#define ERR_LIB_UI 40 +#define ERR_LIB_COMP 41 +#define ERR_LIB_ECDSA 42 +#define ERR_LIB_ECDH 43 +#define ERR_LIB_STORE 44 + +#define ERR_LIB_USER 128 + +#define SYSerr(f,r) ERR_PUT_error(ERR_LIB_SYS,(f),(r),__FILE__,__LINE__) +#define BNerr(f,r) ERR_PUT_error(ERR_LIB_BN,(f),(r),__FILE__,__LINE__) +#define RSAerr(f,r) ERR_PUT_error(ERR_LIB_RSA,(f),(r),__FILE__,__LINE__) +#define DHerr(f,r) ERR_PUT_error(ERR_LIB_DH,(f),(r),__FILE__,__LINE__) +#define EVPerr(f,r) ERR_PUT_error(ERR_LIB_EVP,(f),(r),__FILE__,__LINE__) +#define BUFerr(f,r) ERR_PUT_error(ERR_LIB_BUF,(f),(r),__FILE__,__LINE__) +#define OBJerr(f,r) ERR_PUT_error(ERR_LIB_OBJ,(f),(r),__FILE__,__LINE__) +#define PEMerr(f,r) ERR_PUT_error(ERR_LIB_PEM,(f),(r),__FILE__,__LINE__) +#define DSAerr(f,r) ERR_PUT_error(ERR_LIB_DSA,(f),(r),__FILE__,__LINE__) +#define X509err(f,r) ERR_PUT_error(ERR_LIB_X509,(f),(r),__FILE__,__LINE__) +#define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),__FILE__,__LINE__) +#define CONFerr(f,r) ERR_PUT_error(ERR_LIB_CONF,(f),(r),__FILE__,__LINE__) +#define CRYPTOerr(f,r) ERR_PUT_error(ERR_LIB_CRYPTO,(f),(r),__FILE__,__LINE__) +#define ECerr(f,r) ERR_PUT_error(ERR_LIB_EC,(f),(r),__FILE__,__LINE__) +#define SSLerr(f,r) ERR_PUT_error(ERR_LIB_SSL,(f),(r),__FILE__,__LINE__) +#define BIOerr(f,r) ERR_PUT_error(ERR_LIB_BIO,(f),(r),__FILE__,__LINE__) +#define PKCS7err(f,r) ERR_PUT_error(ERR_LIB_PKCS7,(f),(r),__FILE__,__LINE__) +#define X509V3err(f,r) ERR_PUT_error(ERR_LIB_X509V3,(f),(r),__FILE__,__LINE__) +#define PKCS12err(f,r) ERR_PUT_error(ERR_LIB_PKCS12,(f),(r),__FILE__,__LINE__) +#define RANDerr(f,r) ERR_PUT_error(ERR_LIB_RAND,(f),(r),__FILE__,__LINE__) +#define DSOerr(f,r) ERR_PUT_error(ERR_LIB_DSO,(f),(r),__FILE__,__LINE__) +#define ENGINEerr(f,r) ERR_PUT_error(ERR_LIB_ENGINE,(f),(r),__FILE__,__LINE__) +#define OCSPerr(f,r) ERR_PUT_error(ERR_LIB_OCSP,(f),(r),__FILE__,__LINE__) +#define UIerr(f,r) ERR_PUT_error(ERR_LIB_UI,(f),(r),__FILE__,__LINE__) +#define COMPerr(f,r) ERR_PUT_error(ERR_LIB_COMP,(f),(r),__FILE__,__LINE__) +#define ECDSAerr(f,r) ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),__FILE__,__LINE__) +#define ECDHerr(f,r) ERR_PUT_error(ERR_LIB_ECDH,(f),(r),__FILE__,__LINE__) +#define STOREerr(f,r) ERR_PUT_error(ERR_LIB_STORE,(f),(r),__FILE__,__LINE__) + +/* Borland C seems too stupid to be able to shift and do longs in + * the pre-processor :-( */ +#define ERR_PACK(l,f,r) (((((unsigned long)l)&0xffL)*0x1000000)| \ + ((((unsigned long)f)&0xfffL)*0x1000)| \ + ((((unsigned long)r)&0xfffL))) +#define ERR_GET_LIB(l) (int)((((unsigned long)l)>>24L)&0xffL) +#define ERR_GET_FUNC(l) (int)((((unsigned long)l)>>12L)&0xfffL) +#define ERR_GET_REASON(l) (int)((l)&0xfffL) +#define ERR_FATAL_ERROR(l) (int)((l)&ERR_R_FATAL) + + +/* OS functions */ +#define SYS_F_FOPEN 1 +#define SYS_F_CONNECT 2 +#define SYS_F_GETSERVBYNAME 3 +#define SYS_F_SOCKET 4 +#define SYS_F_IOCTLSOCKET 5 +#define SYS_F_BIND 6 +#define SYS_F_LISTEN 7 +#define SYS_F_ACCEPT 8 +#define SYS_F_WSASTARTUP 9 /* Winsock stuff */ +#define SYS_F_OPENDIR 10 +#define SYS_F_FREAD 11 + + +/* reasons */ +#define ERR_R_SYS_LIB ERR_LIB_SYS /* 2 */ +#define ERR_R_BN_LIB ERR_LIB_BN /* 3 */ +#define ERR_R_RSA_LIB ERR_LIB_RSA /* 4 */ +#define ERR_R_DH_LIB ERR_LIB_DH /* 5 */ +#define ERR_R_EVP_LIB ERR_LIB_EVP /* 6 */ +#define ERR_R_BUF_LIB ERR_LIB_BUF /* 7 */ +#define ERR_R_OBJ_LIB ERR_LIB_OBJ /* 8 */ +#define ERR_R_PEM_LIB ERR_LIB_PEM /* 9 */ +#define ERR_R_DSA_LIB ERR_LIB_DSA /* 10 */ +#define ERR_R_X509_LIB ERR_LIB_X509 /* 11 */ +#define ERR_R_ASN1_LIB ERR_LIB_ASN1 /* 13 */ +#define ERR_R_CONF_LIB ERR_LIB_CONF /* 14 */ +#define ERR_R_CRYPTO_LIB ERR_LIB_CRYPTO /* 15 */ +#define ERR_R_EC_LIB ERR_LIB_EC /* 16 */ +#define ERR_R_SSL_LIB ERR_LIB_SSL /* 20 */ +#define ERR_R_BIO_LIB ERR_LIB_BIO /* 32 */ +#define ERR_R_PKCS7_LIB ERR_LIB_PKCS7 /* 33 */ +#define ERR_R_X509V3_LIB ERR_LIB_X509V3 /* 34 */ +#define ERR_R_PKCS12_LIB ERR_LIB_PKCS12 /* 35 */ +#define ERR_R_RAND_LIB ERR_LIB_RAND /* 36 */ +#define ERR_R_DSO_LIB ERR_LIB_DSO /* 37 */ +#define ERR_R_ENGINE_LIB ERR_LIB_ENGINE /* 38 */ +#define ERR_R_OCSP_LIB ERR_LIB_OCSP /* 39 */ +#define ERR_R_UI_LIB ERR_LIB_UI /* 40 */ +#define ERR_R_COMP_LIB ERR_LIB_COMP /* 41 */ +#define ERR_R_ECDSA_LIB ERR_LIB_ECDSA /* 42 */ +#define ERR_R_ECDH_LIB ERR_LIB_ECDH /* 43 */ +#define ERR_R_STORE_LIB ERR_LIB_STORE /* 44 */ + +#define ERR_R_NESTED_ASN1_ERROR 58 +#define ERR_R_BAD_ASN1_OBJECT_HEADER 59 +#define ERR_R_BAD_GET_ASN1_OBJECT_CALL 60 +#define ERR_R_EXPECTING_AN_ASN1_SEQUENCE 61 +#define ERR_R_ASN1_LENGTH_MISMATCH 62 +#define ERR_R_MISSING_ASN1_EOS 63 + +/* fatal error */ +#define ERR_R_FATAL 64 +#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_INTERNAL_ERROR (4|ERR_R_FATAL) +#define ERR_R_DISABLED (5|ERR_R_FATAL) + +/* 99 is the maximum possible ERR_R_... code, higher values + * are reserved for the individual libraries */ + + +typedef struct ERR_string_data_st + { + unsigned long error; + const char *string; + } ERR_STRING_DATA; + +void ERR_put_error(int lib, int func,int reason,const char *file,int line); +void ERR_set_error_data(char *data,int flags); + +unsigned long ERR_get_error(void); +unsigned long ERR_get_error_line(const char **file,int *line); +unsigned long ERR_get_error_line_data(const char **file,int *line, + const char **data, int *flags); +unsigned long ERR_peek_error(void); +unsigned long ERR_peek_error_line(const char **file,int *line); +unsigned long ERR_peek_error_line_data(const char **file,int *line, + const char **data,int *flags); +unsigned long ERR_peek_last_error(void); +unsigned long ERR_peek_last_error_line(const char **file,int *line); +unsigned long ERR_peek_last_error_line_data(const char **file,int *line, + const char **data,int *flags); +void ERR_clear_error(void ); +char *ERR_error_string(unsigned long e,char *buf); +void ERR_error_string_n(unsigned long e, char *buf, size_t len); +const char *ERR_lib_error_string(unsigned long e); +const char *ERR_func_error_string(unsigned long e); +const char *ERR_reason_error_string(unsigned long e); +void ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u), + void *u); +#ifndef OPENSSL_NO_FP_API +void ERR_print_errors_fp(FILE *fp); +#endif +#ifndef OPENSSL_NO_BIO +void ERR_print_errors(BIO *bp); +void ERR_add_error_data(int num, ...); +#endif +void ERR_load_strings(int lib,ERR_STRING_DATA str[]); +void ERR_unload_strings(int lib,ERR_STRING_DATA str[]); +void ERR_load_ERR_strings(void); +void ERR_load_crypto_strings(void); +void ERR_free_strings(void); + +void ERR_remove_state(unsigned long pid); /* if zero we look it up */ +ERR_STATE *ERR_get_state(void); + +#ifndef OPENSSL_NO_LHASH +LHASH *ERR_get_string_table(void); +LHASH *ERR_get_err_state_table(void); +void ERR_release_err_state_table(LHASH **hash); +#endif + +int ERR_get_next_error_library(void); + +int ERR_set_mark(void); +int ERR_pop_to_mark(void); + +/* Already defined in ossl_typ.h */ +/* typedef struct st_ERR_FNS ERR_FNS; */ +/* An application can use this function and provide the return value to loaded + * modules that should use the application's ERR state/functionality */ +const ERR_FNS *ERR_get_implementation(void); +/* A loaded module should call this function prior to any ERR operations using + * the application's "ERR_FNS". */ +int ERR_set_implementation(const ERR_FNS *fns); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/evp.h b/mswin32/OpenSSL/include/openssl/evp.h new file mode 100755 index 000000000..bdd3b7eca --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/evp.h @@ -0,0 +1,979 @@ +/* crypto/evp/evp.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.] + */ + +#ifndef HEADER_ENVELOPE_H +#define HEADER_ENVELOPE_H + +#ifdef OPENSSL_ALGORITHM_DEFINES +# include +#else +# define OPENSSL_ALGORITHM_DEFINES +# include +# undef OPENSSL_ALGORITHM_DEFINES +#endif + +#include + +#include + +#ifndef OPENSSL_NO_BIO +#include +#endif + +/* +#define EVP_RC2_KEY_SIZE 16 +#define EVP_RC4_KEY_SIZE 16 +#define EVP_BLOWFISH_KEY_SIZE 16 +#define EVP_CAST5_KEY_SIZE 16 +#define EVP_RC5_32_12_16_KEY_SIZE 16 +*/ +#define EVP_MAX_MD_SIZE 64 /* longest known is SHA512 */ +#define EVP_MAX_KEY_LENGTH 32 +#define EVP_MAX_IV_LENGTH 16 +#define EVP_MAX_BLOCK_LENGTH 32 + +#define PKCS5_SALT_LEN 8 +/* Default PKCS#5 iteration count */ +#define PKCS5_DEFAULT_ITER 2048 + +#include + +#define EVP_PK_RSA 0x0001 +#define EVP_PK_DSA 0x0002 +#define EVP_PK_DH 0x0004 +#define EVP_PK_EC 0x0008 +#define EVP_PKT_SIGN 0x0010 +#define EVP_PKT_ENC 0x0020 +#define EVP_PKT_EXCH 0x0040 +#define EVP_PKS_RSA 0x0100 +#define EVP_PKS_DSA 0x0200 +#define EVP_PKS_EC 0x0400 +#define EVP_PKT_EXP 0x1000 /* <= 512 bit key */ + +#define EVP_PKEY_NONE NID_undef +#define EVP_PKEY_RSA NID_rsaEncryption +#define EVP_PKEY_RSA2 NID_rsa +#define EVP_PKEY_DSA NID_dsa +#define EVP_PKEY_DSA1 NID_dsa_2 +#define EVP_PKEY_DSA2 NID_dsaWithSHA +#define EVP_PKEY_DSA3 NID_dsaWithSHA1 +#define EVP_PKEY_DSA4 NID_dsaWithSHA1_2 +#define EVP_PKEY_DH NID_dhKeyAgreement +#define EVP_PKEY_EC NID_X9_62_id_ecPublicKey + +#ifdef __cplusplus +extern "C" { +#endif + +/* Type needs to be a bit field + * Sub-type needs to be for variations on the method, as in, can it do + * arbitrary encryption.... */ +struct evp_pkey_st + { + int type; + int save_type; + int references; + union { + char *ptr; +#ifndef OPENSSL_NO_RSA + struct rsa_st *rsa; /* RSA */ +#endif +#ifndef OPENSSL_NO_DSA + struct dsa_st *dsa; /* DSA */ +#endif +#ifndef OPENSSL_NO_DH + struct dh_st *dh; /* DH */ +#endif +#ifndef OPENSSL_NO_EC + struct ec_key_st *ec; /* ECC */ +#endif + } pkey; + int save_parameters; + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ + } /* EVP_PKEY */; + +#define EVP_PKEY_MO_SIGN 0x0001 +#define EVP_PKEY_MO_VERIFY 0x0002 +#define EVP_PKEY_MO_ENCRYPT 0x0004 +#define EVP_PKEY_MO_DECRYPT 0x0008 + +#if 0 +/* This structure is required to tie the message digest and signing together. + * The lookup can be done by md/pkey_method, oid, oid/pkey_method, or + * oid, md and pkey. + * 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 associated with it. + * This can either be software or a token to provide the required low level + * routines. + */ +typedef struct evp_pkey_md_st + { + int oid; + EVP_MD *md; + EVP_PKEY_METHOD *pkey; + } EVP_PKEY_MD; + +#define EVP_rsa_md2() \ + EVP_PKEY_MD_add(NID_md2WithRSAEncryption,\ + EVP_rsa_pkcs1(),EVP_md2()) +#define EVP_rsa_md5() \ + EVP_PKEY_MD_add(NID_md5WithRSAEncryption,\ + EVP_rsa_pkcs1(),EVP_md5()) +#define EVP_rsa_sha0() \ + EVP_PKEY_MD_add(NID_shaWithRSAEncryption,\ + EVP_rsa_pkcs1(),EVP_sha()) +#define EVP_rsa_sha1() \ + EVP_PKEY_MD_add(NID_sha1WithRSAEncryption,\ + EVP_rsa_pkcs1(),EVP_sha1()) +#define EVP_rsa_ripemd160() \ + EVP_PKEY_MD_add(NID_ripemd160WithRSA,\ + EVP_rsa_pkcs1(),EVP_ripemd160()) +#define EVP_rsa_mdc2() \ + EVP_PKEY_MD_add(NID_mdc2WithRSA,\ + EVP_rsa_octet_string(),EVP_mdc2()) +#define EVP_dsa_sha() \ + EVP_PKEY_MD_add(NID_dsaWithSHA,\ + EVP_dsa(),EVP_sha()) +#define EVP_dsa_sha1() \ + EVP_PKEY_MD_add(NID_dsaWithSHA1,\ + EVP_dsa(),EVP_sha1()) + +typedef struct evp_pkey_method_st + { + char *name; + int flags; + int type; /* RSA, DSA, an SSLeay specific constant */ + int oid; /* For the pub-key type */ + int encrypt_oid; /* pub/priv key encryption */ + + int (*sign)(); + int (*verify)(); + struct { + int (*set)(); /* get and/or set the underlying type */ + int (*get)(); + int (*encrypt)(); + int (*decrypt)(); + int (*i2d)(); + int (*d2i)(); + int (*dup)(); + } pub,priv; + int (*set_asn1_parameters)(); + int (*get_asn1_parameters)(); + } EVP_PKEY_METHOD; +#endif + +#ifndef EVP_MD +struct env_md_st + { + int type; + int pkey_type; + int md_size; + unsigned long flags; + int (*init)(EVP_MD_CTX *ctx); + int (*update)(EVP_MD_CTX *ctx,const void *data,size_t count); + int (*final)(EVP_MD_CTX *ctx,unsigned char *md); + int (*copy)(EVP_MD_CTX *to,const EVP_MD_CTX *from); + int (*cleanup)(EVP_MD_CTX *ctx); + + /* FIXME: prototype these some day */ + int (*sign)(int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, void *key); + int (*verify)(int type, const unsigned char *m, unsigned int m_length, + const unsigned char *sigbuf, unsigned int siglen, + void *key); + int required_pkey_type[5]; /*EVP_PKEY_xxx */ + int block_size; + int ctx_size; /* how big does the ctx->md_data need to be */ + } /* EVP_MD */; + +typedef int evp_sign_method(int type,const unsigned char *m, + unsigned int m_length,unsigned char *sigret, + unsigned int *siglen, void *key); +typedef int evp_verify_method(int type,const unsigned char *m, + unsigned int m_length,const unsigned char *sigbuf, + unsigned int siglen, void *key); + +#define EVP_MD_FLAG_ONESHOT 0x0001 /* digest can only handle a single + * block */ + +#define EVP_PKEY_NULL_method NULL,NULL,{0,0,0,0} + +#ifndef OPENSSL_NO_DSA +#define EVP_PKEY_DSA_method (evp_sign_method *)DSA_sign, \ + (evp_verify_method *)DSA_verify, \ + {EVP_PKEY_DSA,EVP_PKEY_DSA2,EVP_PKEY_DSA3, \ + EVP_PKEY_DSA4,0} +#else +#define EVP_PKEY_DSA_method EVP_PKEY_NULL_method +#endif + +#ifndef OPENSSL_NO_ECDSA +#define EVP_PKEY_ECDSA_method (evp_sign_method *)ECDSA_sign, \ + (evp_verify_method *)ECDSA_verify, \ + {EVP_PKEY_EC,0,0,0} +#else +#define EVP_PKEY_ECDSA_method EVP_PKEY_NULL_method +#endif + +#ifndef OPENSSL_NO_RSA +#define EVP_PKEY_RSA_method (evp_sign_method *)RSA_sign, \ + (evp_verify_method *)RSA_verify, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +#define EVP_PKEY_RSA_ASN1_OCTET_STRING_method \ + (evp_sign_method *)RSA_sign_ASN1_OCTET_STRING, \ + (evp_verify_method *)RSA_verify_ASN1_OCTET_STRING, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +#else +#define EVP_PKEY_RSA_method EVP_PKEY_NULL_method +#define EVP_PKEY_RSA_ASN1_OCTET_STRING_method EVP_PKEY_NULL_method +#endif + +#endif /* !EVP_MD */ + +struct env_md_ctx_st + { + const EVP_MD *digest; + ENGINE *engine; /* functional reference if 'digest' is ENGINE-provided */ + unsigned long flags; + void *md_data; + } /* EVP_MD_CTX */; + +/* values for EVP_MD_CTX flags */ + +#define EVP_MD_CTX_FLAG_ONESHOT 0x0001 /* digest update will be called + * once only */ +#define EVP_MD_CTX_FLAG_CLEANED 0x0002 /* context has already been + * cleaned */ +#define EVP_MD_CTX_FLAG_REUSE 0x0004 /* Don't free up ctx->md_data + * in EVP_MD_CTX_cleanup */ + +struct evp_cipher_st + { + int nid; + int block_size; + int key_len; /* Default value for variable length ciphers */ + int iv_len; + unsigned long flags; /* Various flags */ + int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc); /* init key */ + int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, unsigned int inl);/* encrypt/decrypt data */ + int (*cleanup)(EVP_CIPHER_CTX *); /* cleanup ctx */ + int ctx_size; /* how big ctx->cipher_data needs to be */ + int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Populate a ASN1_TYPE with parameters */ + int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Get parameters from a ASN1_TYPE */ + int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); /* Miscellaneous operations */ + void *app_data; /* Application data */ + } /* EVP_CIPHER */; + +/* Values for cipher flags */ + +/* Modes for ciphers */ + +#define EVP_CIPH_STREAM_CIPHER 0x0 +#define EVP_CIPH_ECB_MODE 0x1 +#define EVP_CIPH_CBC_MODE 0x2 +#define EVP_CIPH_CFB_MODE 0x3 +#define EVP_CIPH_OFB_MODE 0x4 +#define EVP_CIPH_MODE 0x7 +/* Set if variable length cipher */ +#define EVP_CIPH_VARIABLE_LENGTH 0x8 +/* Set if the iv handling should be done by the cipher itself */ +#define EVP_CIPH_CUSTOM_IV 0x10 +/* Set if the cipher's init() function should be called if key is NULL */ +#define EVP_CIPH_ALWAYS_CALL_INIT 0x20 +/* Call ctrl() to init cipher parameters */ +#define EVP_CIPH_CTRL_INIT 0x40 +/* Don't use standard key length function */ +#define EVP_CIPH_CUSTOM_KEY_LENGTH 0x80 +/* Don't use standard block padding */ +#define EVP_CIPH_NO_PADDING 0x100 +/* cipher handles random key generation */ +#define EVP_CIPH_RAND_KEY 0x200 + +/* ctrl() values */ + +#define EVP_CTRL_INIT 0x0 +#define EVP_CTRL_SET_KEY_LENGTH 0x1 +#define EVP_CTRL_GET_RC2_KEY_BITS 0x2 +#define EVP_CTRL_SET_RC2_KEY_BITS 0x3 +#define EVP_CTRL_GET_RC5_ROUNDS 0x4 +#define EVP_CTRL_SET_RC5_ROUNDS 0x5 +#define EVP_CTRL_RAND_KEY 0x6 + +typedef struct evp_cipher_info_st + { + const EVP_CIPHER *cipher; + unsigned char iv[EVP_MAX_IV_LENGTH]; + } EVP_CIPHER_INFO; + +struct evp_cipher_ctx_st + { + const EVP_CIPHER *cipher; + ENGINE *engine; /* functional reference if 'cipher' is ENGINE-provided */ + int encrypt; /* encrypt or decrypt */ + int buf_len; /* number we have left */ + + unsigned char oiv[EVP_MAX_IV_LENGTH]; /* original iv */ + unsigned char iv[EVP_MAX_IV_LENGTH]; /* working iv */ + unsigned char buf[EVP_MAX_BLOCK_LENGTH];/* saved partial block */ + int num; /* used by cfb/ofb mode */ + + void *app_data; /* application stuff */ + int key_len; /* May change for variable length cipher */ + unsigned long flags; /* Various flags */ + void *cipher_data; /* per EVP data */ + int final_used; + int block_mask; + unsigned char final[EVP_MAX_BLOCK_LENGTH];/* possible final block */ + } /* EVP_CIPHER_CTX */; + +typedef struct evp_Encode_Ctx_st + { + int num; /* number saved in a partial encode/decode */ + int length; /* The length is either the output line length + * (in input bytes) or the shortest input line + * length that is ok. Once decoding begins, + * the length is adjusted up each time a longer + * line is decoded */ + unsigned char enc_data[80]; /* data to encode */ + int line_num; /* number read on current line */ + int expect_nl; + } EVP_ENCODE_CTX; + +/* Password based encryption function */ +typedef int (EVP_PBE_KEYGEN)(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de); + +#ifndef OPENSSL_NO_RSA +#define EVP_PKEY_assign_RSA(pkey,rsa) EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\ + (char *)(rsa)) +#endif + +#ifndef OPENSSL_NO_DSA +#define EVP_PKEY_assign_DSA(pkey,dsa) EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\ + (char *)(dsa)) +#endif + +#ifndef OPENSSL_NO_DH +#define EVP_PKEY_assign_DH(pkey,dh) EVP_PKEY_assign((pkey),EVP_PKEY_DH,\ + (char *)(dh)) +#endif + +#ifndef OPENSSL_NO_EC +#define EVP_PKEY_assign_EC_KEY(pkey,eckey) EVP_PKEY_assign((pkey),EVP_PKEY_EC,\ + (char *)(eckey)) +#endif + +/* Add some extra combinations */ +#define EVP_get_digestbynid(a) EVP_get_digestbyname(OBJ_nid2sn(a)) +#define EVP_get_digestbyobj(a) EVP_get_digestbynid(OBJ_obj2nid(a)) +#define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a)) +#define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a)) + +int EVP_MD_type(const EVP_MD *md); +#define EVP_MD_nid(e) EVP_MD_type(e) +#define EVP_MD_name(e) OBJ_nid2sn(EVP_MD_nid(e)) +int EVP_MD_pkey_type(const EVP_MD *md); +int EVP_MD_size(const EVP_MD *md); +int EVP_MD_block_size(const EVP_MD *md); + +const EVP_MD * EVP_MD_CTX_md(const EVP_MD_CTX *ctx); +#define EVP_MD_CTX_size(e) EVP_MD_size(EVP_MD_CTX_md(e)) +#define EVP_MD_CTX_block_size(e) EVP_MD_block_size(EVP_MD_CTX_md(e)) +#define EVP_MD_CTX_type(e) EVP_MD_type(EVP_MD_CTX_md(e)) + +int EVP_CIPHER_nid(const EVP_CIPHER *cipher); +#define EVP_CIPHER_name(e) OBJ_nid2sn(EVP_CIPHER_nid(e)) +int EVP_CIPHER_block_size(const EVP_CIPHER *cipher); +int EVP_CIPHER_key_length(const EVP_CIPHER *cipher); +int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher); +unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher); +#define EVP_CIPHER_mode(e) (EVP_CIPHER_flags(e) & EVP_CIPH_MODE) + +const EVP_CIPHER * EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx); +void * EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx); +void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data); +#define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c)) +unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx); +#define EVP_CIPHER_CTX_mode(e) (EVP_CIPHER_CTX_flags(e) & EVP_CIPH_MODE) + +#define EVP_ENCODE_LENGTH(l) (((l+2)/3*4)+(l/48+1)*2+80) +#define EVP_DECODE_LENGTH(l) ((l+3)/4*3+80) + +#define EVP_SignInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +#define EVP_SignInit(a,b) EVP_DigestInit(a,b) +#define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +#define EVP_VerifyInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +#define EVP_VerifyInit(a,b) EVP_DigestInit(a,b) +#define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +#define EVP_OpenUpdate(a,b,c,d,e) EVP_DecryptUpdate(a,b,c,d,e) +#define EVP_SealUpdate(a,b,c,d,e) EVP_EncryptUpdate(a,b,c,d,e) + +#ifdef CONST_STRICT +void BIO_set_md(BIO *,const EVP_MD *md); +#else +# define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,0,(char *)md) +#endif +#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_set_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_SET_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) + +int EVP_Cipher(EVP_CIPHER_CTX *c, + unsigned char *out, + const unsigned char *in, + unsigned int inl); + +#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); + +void EVP_MD_CTX_init(EVP_MD_CTX *ctx); +int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx); +EVP_MD_CTX *EVP_MD_CTX_create(void); +void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx); +int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out,const EVP_MD_CTX *in); +void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags); +void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags); +int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx,int flags); +int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); +int EVP_DigestUpdate(EVP_MD_CTX *ctx,const void *d, + size_t cnt); +int EVP_DigestFinal_ex(EVP_MD_CTX *ctx,unsigned char *md,unsigned int *s); +int EVP_Digest(const void *data, size_t count, + unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl); + +int EVP_MD_CTX_copy(EVP_MD_CTX *out,const EVP_MD_CTX *in); +int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); +int EVP_DigestFinal(EVP_MD_CTX *ctx,unsigned char *md,unsigned int *s); + +int EVP_read_pw_string(char *buf,int length,const char *prompt,int verify); +void EVP_set_pw_prompt(const char *prompt); +char * EVP_get_pw_prompt(void); + +int EVP_BytesToKey(const EVP_CIPHER *type,const EVP_MD *md, + const unsigned char *salt, const unsigned char *data, + int datal, int count, unsigned char *key,unsigned char *iv); + +int EVP_EncryptInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl, + const unsigned char *key, const unsigned char *iv); +int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl, const unsigned char *in, int inl); +int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); +int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +int EVP_DecryptInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl, + const unsigned char *key, const unsigned char *iv); +int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl, const unsigned char *in, int inl); +int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); + +int EVP_CipherInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, + const unsigned char *key,const unsigned char *iv, + int enc); +int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl, + const unsigned char *key,const unsigned char *iv, + int enc); +int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl, const unsigned char *in, int inl); +int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); + +int EVP_SignFinal(EVP_MD_CTX *ctx,unsigned char *md,unsigned int *s, + EVP_PKEY *pkey); + +int EVP_VerifyFinal(EVP_MD_CTX *ctx,const unsigned char *sigbuf, + unsigned int siglen,EVP_PKEY *pkey); + +int EVP_OpenInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *type, + const unsigned char *ek, int ekl, const unsigned char *iv, + EVP_PKEY *priv); +int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + unsigned char **ek, int *ekl, unsigned char *iv, + EVP_PKEY **pubk, int npubk); +int EVP_SealFinal(EVP_CIPHER_CTX *ctx,unsigned char *out,int *outl); + +void EVP_EncodeInit(EVP_ENCODE_CTX *ctx); +void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl, + const unsigned char *in,int inl); +void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl); +int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_DecodeInit(EVP_ENCODE_CTX *ctx); +int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl, + const unsigned char *in, int inl); +int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned + char *out, int *outl); +int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a); +int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a); +EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); +void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *a); +int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen); +int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); +int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr); +int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key); + +#ifndef OPENSSL_NO_BIO +BIO_METHOD *BIO_f_md(void); +BIO_METHOD *BIO_f_base64(void); +BIO_METHOD *BIO_f_cipher(void); +BIO_METHOD *BIO_f_reliable(void); +void BIO_set_cipher(BIO *b,const EVP_CIPHER *c,const unsigned char *k, + const unsigned char *i, int enc); +#endif + +const EVP_MD *EVP_md_null(void); +#ifndef OPENSSL_NO_MD2 +const EVP_MD *EVP_md2(void); +#endif +#ifndef OPENSSL_NO_MD4 +const EVP_MD *EVP_md4(void); +#endif +#ifndef OPENSSL_NO_MD5 +const EVP_MD *EVP_md5(void); +#endif +#ifndef OPENSSL_NO_SHA +const EVP_MD *EVP_sha(void); +const EVP_MD *EVP_sha1(void); +const EVP_MD *EVP_dss(void); +const EVP_MD *EVP_dss1(void); +const EVP_MD *EVP_ecdsa(void); +#endif +#ifndef OPENSSL_NO_SHA256 +const EVP_MD *EVP_sha224(void); +const EVP_MD *EVP_sha256(void); +#endif +#ifndef OPENSSL_NO_SHA512 +const EVP_MD *EVP_sha384(void); +const EVP_MD *EVP_sha512(void); +#endif +#ifndef OPENSSL_NO_MDC2 +const EVP_MD *EVP_mdc2(void); +#endif +#ifndef OPENSSL_NO_RIPEMD +const EVP_MD *EVP_ripemd160(void); +#endif +const EVP_CIPHER *EVP_enc_null(void); /* does nothing :-) */ +#ifndef OPENSSL_NO_DES +const EVP_CIPHER *EVP_des_ecb(void); +const EVP_CIPHER *EVP_des_ede(void); +const EVP_CIPHER *EVP_des_ede3(void); +const EVP_CIPHER *EVP_des_ede_ecb(void); +const EVP_CIPHER *EVP_des_ede3_ecb(void); +const EVP_CIPHER *EVP_des_cfb64(void); +# define EVP_des_cfb EVP_des_cfb64 +const EVP_CIPHER *EVP_des_cfb1(void); +const EVP_CIPHER *EVP_des_cfb8(void); +const EVP_CIPHER *EVP_des_ede_cfb64(void); +# define EVP_des_ede_cfb EVP_des_ede_cfb64 +#if 0 +const EVP_CIPHER *EVP_des_ede_cfb1(void); +const EVP_CIPHER *EVP_des_ede_cfb8(void); +#endif +const EVP_CIPHER *EVP_des_ede3_cfb64(void); +# define EVP_des_ede3_cfb EVP_des_ede3_cfb64 +const EVP_CIPHER *EVP_des_ede3_cfb1(void); +const EVP_CIPHER *EVP_des_ede3_cfb8(void); +const EVP_CIPHER *EVP_des_ofb(void); +const EVP_CIPHER *EVP_des_ede_ofb(void); +const EVP_CIPHER *EVP_des_ede3_ofb(void); +const EVP_CIPHER *EVP_des_cbc(void); +const EVP_CIPHER *EVP_des_ede_cbc(void); +const EVP_CIPHER *EVP_des_ede3_cbc(void); +const EVP_CIPHER *EVP_desx_cbc(void); +/* This should now be supported through the dev_crypto ENGINE. But also, why are + * rc4 and md5 declarations made here inside a "NO_DES" precompiler branch? */ +#if 0 +# ifdef OPENSSL_OPENBSD_DEV_CRYPTO +const EVP_CIPHER *EVP_dev_crypto_des_ede3_cbc(void); +const EVP_CIPHER *EVP_dev_crypto_rc4(void); +const EVP_MD *EVP_dev_crypto_md5(void); +# endif +#endif +#endif +#ifndef OPENSSL_NO_RC4 +const EVP_CIPHER *EVP_rc4(void); +const EVP_CIPHER *EVP_rc4_40(void); +#endif +#ifndef OPENSSL_NO_IDEA +const EVP_CIPHER *EVP_idea_ecb(void); +const EVP_CIPHER *EVP_idea_cfb64(void); +# define EVP_idea_cfb EVP_idea_cfb64 +const EVP_CIPHER *EVP_idea_ofb(void); +const EVP_CIPHER *EVP_idea_cbc(void); +#endif +#ifndef OPENSSL_NO_RC2 +const EVP_CIPHER *EVP_rc2_ecb(void); +const EVP_CIPHER *EVP_rc2_cbc(void); +const EVP_CIPHER *EVP_rc2_40_cbc(void); +const EVP_CIPHER *EVP_rc2_64_cbc(void); +const EVP_CIPHER *EVP_rc2_cfb64(void); +# define EVP_rc2_cfb EVP_rc2_cfb64 +const EVP_CIPHER *EVP_rc2_ofb(void); +#endif +#ifndef OPENSSL_NO_BF +const EVP_CIPHER *EVP_bf_ecb(void); +const EVP_CIPHER *EVP_bf_cbc(void); +const EVP_CIPHER *EVP_bf_cfb64(void); +# define EVP_bf_cfb EVP_bf_cfb64 +const EVP_CIPHER *EVP_bf_ofb(void); +#endif +#ifndef OPENSSL_NO_CAST +const EVP_CIPHER *EVP_cast5_ecb(void); +const EVP_CIPHER *EVP_cast5_cbc(void); +const EVP_CIPHER *EVP_cast5_cfb64(void); +# define EVP_cast5_cfb EVP_cast5_cfb64 +const EVP_CIPHER *EVP_cast5_ofb(void); +#endif +#ifndef OPENSSL_NO_RC5 +const EVP_CIPHER *EVP_rc5_32_12_16_cbc(void); +const EVP_CIPHER *EVP_rc5_32_12_16_ecb(void); +const EVP_CIPHER *EVP_rc5_32_12_16_cfb64(void); +# define EVP_rc5_32_12_16_cfb EVP_rc5_32_12_16_cfb64 +const EVP_CIPHER *EVP_rc5_32_12_16_ofb(void); +#endif +#ifndef OPENSSL_NO_AES +const EVP_CIPHER *EVP_aes_128_ecb(void); +const EVP_CIPHER *EVP_aes_128_cbc(void); +const EVP_CIPHER *EVP_aes_128_cfb1(void); +const EVP_CIPHER *EVP_aes_128_cfb8(void); +const EVP_CIPHER *EVP_aes_128_cfb128(void); +# define EVP_aes_128_cfb EVP_aes_128_cfb128 +const EVP_CIPHER *EVP_aes_128_ofb(void); +#if 0 +const EVP_CIPHER *EVP_aes_128_ctr(void); +#endif +const EVP_CIPHER *EVP_aes_192_ecb(void); +const EVP_CIPHER *EVP_aes_192_cbc(void); +const EVP_CIPHER *EVP_aes_192_cfb1(void); +const EVP_CIPHER *EVP_aes_192_cfb8(void); +const EVP_CIPHER *EVP_aes_192_cfb128(void); +# define EVP_aes_192_cfb EVP_aes_192_cfb128 +const EVP_CIPHER *EVP_aes_192_ofb(void); +#if 0 +const EVP_CIPHER *EVP_aes_192_ctr(void); +#endif +const EVP_CIPHER *EVP_aes_256_ecb(void); +const EVP_CIPHER *EVP_aes_256_cbc(void); +const EVP_CIPHER *EVP_aes_256_cfb1(void); +const EVP_CIPHER *EVP_aes_256_cfb8(void); +const EVP_CIPHER *EVP_aes_256_cfb128(void); +# define EVP_aes_256_cfb EVP_aes_256_cfb128 +const EVP_CIPHER *EVP_aes_256_ofb(void); +#if 0 +const EVP_CIPHER *EVP_aes_256_ctr(void); +#endif +#endif +#ifndef OPENSSL_NO_CAMELLIA +const EVP_CIPHER *EVP_camellia_128_ecb(void); +const EVP_CIPHER *EVP_camellia_128_cbc(void); +const EVP_CIPHER *EVP_camellia_128_cfb1(void); +const EVP_CIPHER *EVP_camellia_128_cfb8(void); +const EVP_CIPHER *EVP_camellia_128_cfb128(void); +# define EVP_camellia_128_cfb EVP_camellia_128_cfb128 +const EVP_CIPHER *EVP_camellia_128_ofb(void); +const EVP_CIPHER *EVP_camellia_192_ecb(void); +const EVP_CIPHER *EVP_camellia_192_cbc(void); +const EVP_CIPHER *EVP_camellia_192_cfb1(void); +const EVP_CIPHER *EVP_camellia_192_cfb8(void); +const EVP_CIPHER *EVP_camellia_192_cfb128(void); +# define EVP_camellia_192_cfb EVP_camellia_192_cfb128 +const EVP_CIPHER *EVP_camellia_192_ofb(void); +const EVP_CIPHER *EVP_camellia_256_ecb(void); +const EVP_CIPHER *EVP_camellia_256_cbc(void); +const EVP_CIPHER *EVP_camellia_256_cfb1(void); +const EVP_CIPHER *EVP_camellia_256_cfb8(void); +const EVP_CIPHER *EVP_camellia_256_cfb128(void); +# define EVP_camellia_256_cfb EVP_camellia_256_cfb128 +const EVP_CIPHER *EVP_camellia_256_ofb(void); +#endif + +#ifndef OPENSSL_NO_SEED +const EVP_CIPHER *EVP_seed_ecb(void); +const EVP_CIPHER *EVP_seed_cbc(void); +const EVP_CIPHER *EVP_seed_cfb128(void); +# define EVP_seed_cfb EVP_seed_cfb128 +const EVP_CIPHER *EVP_seed_ofb(void); +#endif + +void OPENSSL_add_all_algorithms_noconf(void); +void OPENSSL_add_all_algorithms_conf(void); + +#ifdef OPENSSL_LOAD_CONF +#define OpenSSL_add_all_algorithms() \ + OPENSSL_add_all_algorithms_conf() +#else +#define OpenSSL_add_all_algorithms() \ + OPENSSL_add_all_algorithms_noconf() +#endif + +void OpenSSL_add_all_ciphers(void); +void OpenSSL_add_all_digests(void); +#define SSLeay_add_all_algorithms() OpenSSL_add_all_algorithms() +#define SSLeay_add_all_ciphers() OpenSSL_add_all_ciphers() +#define SSLeay_add_all_digests() OpenSSL_add_all_digests() + +int EVP_add_cipher(const EVP_CIPHER *cipher); +int EVP_add_digest(const EVP_MD *digest); + +const EVP_CIPHER *EVP_get_cipherbyname(const char *name); +const EVP_MD *EVP_get_digestbyname(const char *name); +void EVP_cleanup(void); + +int EVP_PKEY_decrypt(unsigned char *dec_key, + const unsigned char *enc_key,int enc_key_len, + EVP_PKEY *private_key); +int EVP_PKEY_encrypt(unsigned char *enc_key, + const unsigned char *key,int key_len, + EVP_PKEY *pub_key); +int EVP_PKEY_type(int type); +int EVP_PKEY_bits(EVP_PKEY *pkey); +int EVP_PKEY_size(EVP_PKEY *pkey); +int EVP_PKEY_assign(EVP_PKEY *pkey,int type,char *key); + +#ifndef OPENSSL_NO_RSA +struct rsa_st; +int EVP_PKEY_set1_RSA(EVP_PKEY *pkey,struct rsa_st *key); +struct rsa_st *EVP_PKEY_get1_RSA(EVP_PKEY *pkey); +#endif +#ifndef OPENSSL_NO_DSA +struct dsa_st; +int EVP_PKEY_set1_DSA(EVP_PKEY *pkey,struct dsa_st *key); +struct dsa_st *EVP_PKEY_get1_DSA(EVP_PKEY *pkey); +#endif +#ifndef OPENSSL_NO_DH +struct dh_st; +int EVP_PKEY_set1_DH(EVP_PKEY *pkey,struct dh_st *key); +struct dh_st *EVP_PKEY_get1_DH(EVP_PKEY *pkey); +#endif +#ifndef OPENSSL_NO_EC +struct ec_key_st; +int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey,struct ec_key_st *key); +struct ec_key_st *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey); +#endif + +EVP_PKEY * EVP_PKEY_new(void); +void EVP_PKEY_free(EVP_PKEY *pkey); + +EVP_PKEY * d2i_PublicKey(int type,EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PublicKey(EVP_PKEY *a, unsigned char **pp); + +EVP_PKEY * d2i_PrivateKey(int type,EVP_PKEY **a, const unsigned char **pp, + long length); +EVP_PKEY * d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp); + +int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from); +int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey); +int EVP_PKEY_save_parameters(EVP_PKEY *pkey,int mode); +int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_CIPHER_type(const EVP_CIPHER *ctx); + +/* calls methods */ +int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* These are used by EVP_CIPHER methods */ +int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c,ASN1_TYPE *type); +int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c,ASN1_TYPE *type); + +/* PKCS5 password based encryption */ +int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md, + int en_de); +int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, + int keylen, unsigned char *out); +int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md, + int en_de); + +void PKCS5_PBE_add(void); + +int EVP_PBE_CipherInit (ASN1_OBJECT *pbe_obj, const char *pass, int passlen, + ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de); +int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, + EVP_PBE_KEYGEN *keygen); +void EVP_PBE_cleanup(void); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_EVP_strings(void); + +/* Error codes for the EVP functions. */ + +/* Function codes. */ +#define EVP_F_AES_INIT_KEY 133 +#define EVP_F_CAMELLIA_INIT_KEY 159 +#define EVP_F_D2I_PKEY 100 +#define EVP_F_DSAPKEY2PKCS8 134 +#define EVP_F_DSA_PKEY2PKCS8 135 +#define EVP_F_ECDSA_PKEY2PKCS8 129 +#define EVP_F_ECKEY_PKEY2PKCS8 132 +#define EVP_F_EVP_CIPHERINIT_EX 123 +#define EVP_F_EVP_CIPHER_CTX_CTRL 124 +#define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH 122 +#define EVP_F_EVP_DECRYPTFINAL_EX 101 +#define EVP_F_EVP_DIGESTINIT_EX 128 +#define EVP_F_EVP_ENCRYPTFINAL_EX 127 +#define EVP_F_EVP_MD_CTX_COPY_EX 110 +#define EVP_F_EVP_OPENINIT 102 +#define EVP_F_EVP_PBE_ALG_ADD 115 +#define EVP_F_EVP_PBE_CIPHERINIT 116 +#define EVP_F_EVP_PKCS82PKEY 111 +#define EVP_F_EVP_PKEY2PKCS8_BROKEN 113 +#define EVP_F_EVP_PKEY_COPY_PARAMETERS 103 +#define EVP_F_EVP_PKEY_DECRYPT 104 +#define EVP_F_EVP_PKEY_ENCRYPT 105 +#define EVP_F_EVP_PKEY_GET1_DH 119 +#define EVP_F_EVP_PKEY_GET1_DSA 120 +#define EVP_F_EVP_PKEY_GET1_ECDSA 130 +#define EVP_F_EVP_PKEY_GET1_EC_KEY 131 +#define EVP_F_EVP_PKEY_GET1_RSA 121 +#define EVP_F_EVP_PKEY_NEW 106 +#define EVP_F_EVP_RIJNDAEL 126 +#define EVP_F_EVP_SIGNFINAL 107 +#define EVP_F_EVP_VERIFYFINAL 108 +#define EVP_F_PKCS5_PBE_KEYIVGEN 117 +#define EVP_F_PKCS5_V2_PBE_KEYIVGEN 118 +#define EVP_F_PKCS8_SET_BROKEN 112 +#define EVP_F_RC2_MAGIC_TO_METH 109 +#define EVP_F_RC5_CTRL 125 + +/* Reason codes. */ +#define EVP_R_AES_KEY_SETUP_FAILED 143 +#define EVP_R_ASN1_LIB 140 +#define EVP_R_BAD_BLOCK_LENGTH 136 +#define EVP_R_BAD_DECRYPT 100 +#define EVP_R_BAD_KEY_LENGTH 137 +#define EVP_R_BN_DECODE_ERROR 112 +#define EVP_R_BN_PUBKEY_ERROR 113 +#define EVP_R_CAMELLIA_KEY_SETUP_FAILED 157 +#define EVP_R_CIPHER_PARAMETER_ERROR 122 +#define EVP_R_CTRL_NOT_IMPLEMENTED 132 +#define EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED 133 +#define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH 138 +#define EVP_R_DECODE_ERROR 114 +#define EVP_R_DIFFERENT_KEY_TYPES 101 +#define EVP_R_ENCODE_ERROR 115 +#define EVP_R_EVP_PBE_CIPHERINIT_ERROR 119 +#define EVP_R_EXPECTING_AN_RSA_KEY 127 +#define EVP_R_EXPECTING_A_DH_KEY 128 +#define EVP_R_EXPECTING_A_DSA_KEY 129 +#define EVP_R_EXPECTING_A_ECDSA_KEY 141 +#define EVP_R_EXPECTING_A_EC_KEY 142 +#define EVP_R_INITIALIZATION_ERROR 134 +#define EVP_R_INPUT_NOT_INITIALIZED 111 +#define EVP_R_INVALID_KEY_LENGTH 130 +#define EVP_R_IV_TOO_LARGE 102 +#define EVP_R_KEYGEN_FAILURE 120 +#define EVP_R_MISSING_PARAMETERS 103 +#define EVP_R_NO_CIPHER_SET 131 +#define EVP_R_NO_DIGEST_SET 139 +#define EVP_R_NO_DSA_PARAMETERS 116 +#define EVP_R_NO_SIGN_FUNCTION_CONFIGURED 104 +#define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED 105 +#define EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE 117 +#define EVP_R_PUBLIC_KEY_NOT_RSA 106 +#define EVP_R_UNKNOWN_PBE_ALGORITHM 121 +#define EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS 135 +#define EVP_R_UNSUPPORTED_CIPHER 107 +#define EVP_R_UNSUPPORTED_KEYLENGTH 123 +#define EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION 124 +#define EVP_R_UNSUPPORTED_KEY_SIZE 108 +#define EVP_R_UNSUPPORTED_PRF 125 +#define EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM 118 +#define EVP_R_UNSUPPORTED_SALT_TYPE 126 +#define EVP_R_WRONG_FINAL_BLOCK_LENGTH 109 +#define EVP_R_WRONG_PUBLIC_KEY_TYPE 110 +#define EVP_R_SEED_KEY_SETUP_FAILED 162 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/hmac.h b/mswin32/OpenSSL/include/openssl/hmac.h new file mode 100755 index 000000000..719fc408a --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/hmac.h @@ -0,0 +1,108 @@ +/* crypto/hmac/hmac.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.] + */ +#ifndef HEADER_HMAC_H +#define HEADER_HMAC_H + +#include + +#ifdef OPENSSL_NO_HMAC +#error HMAC is disabled. +#endif + +#include + +#define HMAC_MAX_MD_CBLOCK 128 /* largest known is SHA512 */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct hmac_ctx_st + { + const EVP_MD *md; + EVP_MD_CTX md_ctx; + EVP_MD_CTX i_ctx; + EVP_MD_CTX o_ctx; + unsigned int key_length; + unsigned char key[HMAC_MAX_MD_CBLOCK]; + } HMAC_CTX; + +#define HMAC_size(e) (EVP_MD_size((e)->md)) + + +void HMAC_CTX_init(HMAC_CTX *ctx); +void HMAC_CTX_cleanup(HMAC_CTX *ctx); + +#define HMAC_cleanup(ctx) HMAC_CTX_cleanup(ctx) /* deprecated */ + +void HMAC_Init(HMAC_CTX *ctx, const void *key, int len, + const EVP_MD *md); /* deprecated */ +void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, + const EVP_MD *md, ENGINE *impl); +void HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len); +void HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len); +unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, + const unsigned char *d, size_t n, unsigned char *md, + unsigned int *md_len); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/idea.h b/mswin32/OpenSSL/include/openssl/idea.h new file mode 100755 index 000000000..bf97a37e3 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/idea.h @@ -0,0 +1,100 @@ +/* crypto/idea/idea.h */ +/* 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.] + */ + +#ifndef HEADER_IDEA_H +#define HEADER_IDEA_H + +#include /* IDEA_INT, OPENSSL_NO_IDEA */ + +#ifdef OPENSSL_NO_IDEA +#error IDEA is disabled. +#endif + +#define IDEA_ENCRYPT 1 +#define IDEA_DECRYPT 0 + +#define IDEA_BLOCK 8 +#define IDEA_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct idea_key_st + { + IDEA_INT data[9][6]; + } IDEA_KEY_SCHEDULE; + +const char *idea_options(void); +void idea_ecb_encrypt(const unsigned char *in, unsigned char *out, + IDEA_KEY_SCHEDULE *ks); +void idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks); +void idea_set_decrypt_key(const IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk); +void idea_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv,int enc); +void idea_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int *num,int enc); +void idea_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, int *num); +void idea_encrypt(unsigned long *in, IDEA_KEY_SCHEDULE *ks); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/krb5_asn.h b/mswin32/OpenSSL/include/openssl/krb5_asn.h new file mode 100755 index 000000000..41725d0dc --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/krb5_asn.h @@ -0,0 +1,256 @@ +/* krb5_asn.h */ +/* Written by Vern Staats for the OpenSSL project, +** using ocsp/{*.h,*asn*.c} as a starting point +*/ + +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_KRB5_ASN_H +#define HEADER_KRB5_ASN_H + +/* +#include +*/ +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* ASN.1 from Kerberos RFC 1510 +*/ + +/* EncryptedData ::= SEQUENCE { +** etype[0] INTEGER, -- EncryptionType +** kvno[1] INTEGER OPTIONAL, +** cipher[2] OCTET STRING -- ciphertext +** } +*/ +typedef struct krb5_encdata_st + { + ASN1_INTEGER *etype; + ASN1_INTEGER *kvno; + ASN1_OCTET_STRING *cipher; + } KRB5_ENCDATA; + +DECLARE_STACK_OF(KRB5_ENCDATA) + +/* PrincipalName ::= SEQUENCE { +** name-type[0] INTEGER, +** name-string[1] SEQUENCE OF GeneralString +** } +*/ +typedef struct krb5_princname_st + { + ASN1_INTEGER *nametype; + STACK_OF(ASN1_GENERALSTRING) *namestring; + } KRB5_PRINCNAME; + +DECLARE_STACK_OF(KRB5_PRINCNAME) + + +/* Ticket ::= [APPLICATION 1] SEQUENCE { +** tkt-vno[0] INTEGER, +** realm[1] Realm, +** sname[2] PrincipalName, +** enc-part[3] EncryptedData +** } +*/ +typedef struct krb5_tktbody_st + { + ASN1_INTEGER *tktvno; + ASN1_GENERALSTRING *realm; + KRB5_PRINCNAME *sname; + KRB5_ENCDATA *encdata; + } KRB5_TKTBODY; + +typedef STACK_OF(KRB5_TKTBODY) KRB5_TICKET; +DECLARE_STACK_OF(KRB5_TKTBODY) + + +/* AP-REQ ::= [APPLICATION 14] SEQUENCE { +** pvno[0] INTEGER, +** msg-type[1] INTEGER, +** ap-options[2] APOptions, +** ticket[3] Ticket, +** authenticator[4] EncryptedData +** } +** +** APOptions ::= BIT STRING { +** reserved(0), use-session-key(1), mutual-required(2) } +*/ +typedef struct krb5_ap_req_st + { + ASN1_INTEGER *pvno; + ASN1_INTEGER *msgtype; + ASN1_BIT_STRING *apoptions; + KRB5_TICKET *ticket; + KRB5_ENCDATA *authenticator; + } KRB5_APREQBODY; + +typedef STACK_OF(KRB5_APREQBODY) KRB5_APREQ; +DECLARE_STACK_OF(KRB5_APREQBODY) + + +/* Authenticator Stuff */ + + +/* Checksum ::= SEQUENCE { +** cksumtype[0] INTEGER, +** checksum[1] OCTET STRING +** } +*/ +typedef struct krb5_checksum_st + { + ASN1_INTEGER *ctype; + ASN1_OCTET_STRING *checksum; + } KRB5_CHECKSUM; + +DECLARE_STACK_OF(KRB5_CHECKSUM) + + +/* EncryptionKey ::= SEQUENCE { +** keytype[0] INTEGER, +** keyvalue[1] OCTET STRING +** } +*/ +typedef struct krb5_encryptionkey_st + { + ASN1_INTEGER *ktype; + ASN1_OCTET_STRING *keyvalue; + } KRB5_ENCKEY; + +DECLARE_STACK_OF(KRB5_ENCKEY) + + +/* AuthorizationData ::= SEQUENCE OF SEQUENCE { +** ad-type[0] INTEGER, +** ad-data[1] OCTET STRING +** } +*/ +typedef struct krb5_authorization_st + { + ASN1_INTEGER *adtype; + ASN1_OCTET_STRING *addata; + } KRB5_AUTHDATA; + +DECLARE_STACK_OF(KRB5_AUTHDATA) + + +/* -- Unencrypted authenticator +** Authenticator ::= [APPLICATION 2] SEQUENCE { +** authenticator-vno[0] INTEGER, +** crealm[1] Realm, +** cname[2] PrincipalName, +** cksum[3] Checksum OPTIONAL, +** cusec[4] INTEGER, +** ctime[5] KerberosTime, +** subkey[6] EncryptionKey OPTIONAL, +** seq-number[7] INTEGER OPTIONAL, +** authorization-data[8] AuthorizationData OPTIONAL +** } +*/ +typedef struct krb5_authenticator_st + { + ASN1_INTEGER *avno; + ASN1_GENERALSTRING *crealm; + KRB5_PRINCNAME *cname; + KRB5_CHECKSUM *cksum; + ASN1_INTEGER *cusec; + ASN1_GENERALIZEDTIME *ctime; + KRB5_ENCKEY *subkey; + ASN1_INTEGER *seqnum; + KRB5_AUTHDATA *authorization; + } KRB5_AUTHENTBODY; + +typedef STACK_OF(KRB5_AUTHENTBODY) KRB5_AUTHENT; +DECLARE_STACK_OF(KRB5_AUTHENTBODY) + + +/* DECLARE_ASN1_FUNCTIONS(type) = DECLARE_ASN1_FUNCTIONS_name(type, type) = +** type *name##_new(void); +** void name##_free(type *a); +** DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) = +** DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) = +** type *d2i_##name(type **a, const unsigned char **in, long len); +** int i2d_##name(type *a, unsigned char **out); +** DECLARE_ASN1_ITEM(itname) = OPENSSL_EXTERN const ASN1_ITEM itname##_it +*/ + +DECLARE_ASN1_FUNCTIONS(KRB5_ENCDATA) +DECLARE_ASN1_FUNCTIONS(KRB5_PRINCNAME) +DECLARE_ASN1_FUNCTIONS(KRB5_TKTBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_APREQBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_TICKET) +DECLARE_ASN1_FUNCTIONS(KRB5_APREQ) + +DECLARE_ASN1_FUNCTIONS(KRB5_CHECKSUM) +DECLARE_ASN1_FUNCTIONS(KRB5_ENCKEY) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHDATA) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENTBODY) +DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENT) + + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/mswin32/OpenSSL/include/openssl/kssl.h b/mswin32/OpenSSL/include/openssl/kssl.h new file mode 100755 index 000000000..a3d20e1cc --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/kssl.h @@ -0,0 +1,179 @@ +/* ssl/kssl.h -*- mode: C; c-file-style: "eay" -*- */ +/* Written by Vern Staats for the OpenSSL project 2000. + * project 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* +** 19990701 VRS Started. +*/ + +#ifndef KSSL_H +#define KSSL_H + +#include + +#ifndef OPENSSL_NO_KRB5 + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Depending on which KRB5 implementation used, some types from +** the other may be missing. Resolve that here and now +*/ +#ifdef KRB5_HEIMDAL +typedef unsigned char krb5_octet; +#define FAR +#else + +#ifndef FAR +#define FAR +#endif + +#endif + +/* Uncomment this to debug kssl problems or +** to trace usage of the Kerberos session key +** +** #define KSSL_DEBUG +*/ + +#ifndef KRB5SVC +#define KRB5SVC "host" +#endif + +#ifndef KRB5KEYTAB +#define KRB5KEYTAB "/etc/krb5.keytab" +#endif + +#ifndef KRB5SENDAUTH +#define KRB5SENDAUTH 1 +#endif + +#ifndef KRB5CHECKAUTH +#define KRB5CHECKAUTH 1 +#endif + +#ifndef KSSL_CLOCKSKEW +#define KSSL_CLOCKSKEW 300; +#endif + +#define KSSL_ERR_MAX 255 +typedef struct kssl_err_st { + int reason; + char text[KSSL_ERR_MAX+1]; + } KSSL_ERR; + + +/* Context for passing +** (1) Kerberos session key to SSL, and +** (2) Config data between application and SSL lib +*/ +typedef struct kssl_ctx_st + { + /* used by: disposition: */ + char *service_name; /* C,S default ok (kssl) */ + char *service_host; /* C input, REQUIRED */ + char *client_princ; /* S output from krb5 ticket */ + char *keytab_file; /* S NULL (/etc/krb5.keytab) */ + char *cred_cache; /* C NULL (default) */ + krb5_enctype enctype; + int length; + krb5_octet FAR *key; + } KSSL_CTX; + +#define KSSL_CLIENT 1 +#define KSSL_SERVER 2 +#define KSSL_SERVICE 3 +#define KSSL_KEYTAB 4 + +#define KSSL_CTX_OK 0 +#define KSSL_CTX_ERR 1 +#define KSSL_NOMEM 2 + +/* Public (for use by applications that use OpenSSL with Kerberos 5 support */ +krb5_error_code kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text); +KSSL_CTX *kssl_ctx_new(void); +KSSL_CTX *kssl_ctx_free(KSSL_CTX *kssl_ctx); +void kssl_ctx_show(KSSL_CTX *kssl_ctx); +krb5_error_code kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which, + krb5_data *realm, krb5_data *entity, int nentities); +krb5_error_code kssl_cget_tkt(KSSL_CTX *kssl_ctx, krb5_data **enc_tktp, + krb5_data *authenp, KSSL_ERR *kssl_err); +krb5_error_code kssl_sget_tkt(KSSL_CTX *kssl_ctx, krb5_data *indata, + krb5_ticket_times *ttimes, KSSL_ERR *kssl_err); +krb5_error_code kssl_ctx_setkey(KSSL_CTX *kssl_ctx, krb5_keyblock *session); +void kssl_err_set(KSSL_ERR *kssl_err, int reason, char *text); +void kssl_krb5_free_data_contents(krb5_context context, krb5_data *data); +krb5_error_code kssl_build_principal_2(krb5_context context, + krb5_principal *princ, int rlen, const char *realm, + int slen, const char *svc, int hlen, const char *host); +krb5_error_code kssl_validate_times(krb5_timestamp atime, + krb5_ticket_times *ttimes); +krb5_error_code kssl_check_authent(KSSL_CTX *kssl_ctx, krb5_data *authentp, + krb5_timestamp *atimep, KSSL_ERR *kssl_err); +unsigned char *kssl_skip_confound(krb5_enctype enctype, unsigned char *authn); + +#ifdef __cplusplus +} +#endif +#endif /* OPENSSL_NO_KRB5 */ +#endif /* KSSL_H */ diff --git a/mswin32/OpenSSL/include/openssl/lhash.h b/mswin32/OpenSSL/include/openssl/lhash.h new file mode 100755 index 000000000..d392d0cd8 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/lhash.h @@ -0,0 +1,200 @@ +/* crypto/lhash/lhash.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_LHASH_H +#define HEADER_LHASH_H + +#include +#ifndef OPENSSL_NO_FP_API +#include +#endif + +#ifndef OPENSSL_NO_BIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct lhash_node_st + { + void *data; + struct lhash_node_st *next; +#ifndef OPENSSL_NO_HASH_COMP + unsigned long hash; +#endif + } LHASH_NODE; + +typedef int (*LHASH_COMP_FN_TYPE)(const void *, const void *); +typedef unsigned long (*LHASH_HASH_FN_TYPE)(const void *); +typedef void (*LHASH_DOALL_FN_TYPE)(void *); +typedef void (*LHASH_DOALL_ARG_FN_TYPE)(void *, void *); + +/* Macros for declaring and implementing type-safe wrappers for LHASH callbacks. + * This way, callbacks can be provided to LHASH structures without function + * pointer casting and the macro-defined callbacks provide per-variable casting + * before deferring to the underlying type-specific callbacks. NB: It is + * possible to place a "static" in front of both the DECLARE and IMPLEMENT + * macros if the functions are strictly internal. */ + +/* First: "hash" functions */ +#define DECLARE_LHASH_HASH_FN(f_name,o_type) \ + unsigned long f_name##_LHASH_HASH(const void *); +#define IMPLEMENT_LHASH_HASH_FN(f_name,o_type) \ + unsigned long f_name##_LHASH_HASH(const void *arg) { \ + o_type a = (o_type)arg; \ + return f_name(a); } +#define LHASH_HASH_FN(f_name) f_name##_LHASH_HASH + +/* Second: "compare" functions */ +#define DECLARE_LHASH_COMP_FN(f_name,o_type) \ + int f_name##_LHASH_COMP(const void *, const void *); +#define IMPLEMENT_LHASH_COMP_FN(f_name,o_type) \ + int f_name##_LHASH_COMP(const void *arg1, const void *arg2) { \ + o_type a = (o_type)arg1; \ + o_type b = (o_type)arg2; \ + return f_name(a,b); } +#define LHASH_COMP_FN(f_name) f_name##_LHASH_COMP + +/* Third: "doall" functions */ +#define DECLARE_LHASH_DOALL_FN(f_name,o_type) \ + void f_name##_LHASH_DOALL(void *); +#define IMPLEMENT_LHASH_DOALL_FN(f_name,o_type) \ + void f_name##_LHASH_DOALL(void *arg) { \ + o_type a = (o_type)arg; \ + f_name(a); } +#define LHASH_DOALL_FN(f_name) f_name##_LHASH_DOALL + +/* Fourth: "doall_arg" functions */ +#define DECLARE_LHASH_DOALL_ARG_FN(f_name,o_type,a_type) \ + void f_name##_LHASH_DOALL_ARG(void *, void *); +#define IMPLEMENT_LHASH_DOALL_ARG_FN(f_name,o_type,a_type) \ + void f_name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ + o_type a = (o_type)arg1; \ + a_type b = (a_type)arg2; \ + f_name(a,b); } +#define LHASH_DOALL_ARG_FN(f_name) f_name##_LHASH_DOALL_ARG + +typedef struct lhash_st + { + LHASH_NODE **b; + LHASH_COMP_FN_TYPE comp; + LHASH_HASH_FN_TYPE hash; + unsigned int num_nodes; + unsigned int num_alloc_nodes; + unsigned int p; + unsigned int pmax; + unsigned long up_load; /* load times 256 */ + unsigned long down_load; /* load times 256 */ + unsigned long num_items; + + unsigned long num_expands; + unsigned long num_expand_reallocs; + unsigned long num_contracts; + unsigned long num_contract_reallocs; + unsigned long num_hash_calls; + unsigned long num_comp_calls; + unsigned long num_insert; + unsigned long num_replace; + unsigned long num_delete; + unsigned long num_no_delete; + 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) + +LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c); +void lh_free(LHASH *lh); +void *lh_insert(LHASH *lh, void *data); +void *lh_delete(LHASH *lh, const void *data); +void *lh_retrieve(LHASH *lh, const void *data); +void lh_doall(LHASH *lh, LHASH_DOALL_FN_TYPE func); +void lh_doall_arg(LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg); +unsigned long lh_strhash(const char *c); +unsigned long lh_num_items(const LHASH *lh); + +#ifndef OPENSSL_NO_FP_API +void lh_stats(const LHASH *lh, FILE *out); +void lh_node_stats(const LHASH *lh, FILE *out); +void lh_node_usage_stats(const LHASH *lh, FILE *out); +#endif + +#ifndef OPENSSL_NO_BIO +void lh_stats_bio(const LHASH *lh, BIO *out); +void lh_node_stats_bio(const LHASH *lh, BIO *out); +void lh_node_usage_stats_bio(const LHASH *lh, BIO *out); +#endif +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/mswin32/OpenSSL/include/openssl/md2.h b/mswin32/OpenSSL/include/openssl/md2.h new file mode 100755 index 000000000..a46120e7d --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/md2.h @@ -0,0 +1,92 @@ +/* crypto/md/md2.h */ +/* 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.] + */ + +#ifndef HEADER_MD2_H +#define HEADER_MD2_H + +#include /* OPENSSL_NO_MD2, MD2_INT */ +#ifdef OPENSSL_NO_MD2 +#error MD2 is disabled. +#endif +#include + +#define MD2_DIGEST_LENGTH 16 +#define MD2_BLOCK 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct MD2state_st + { + unsigned int num; + unsigned char data[MD2_BLOCK]; + MD2_INT cksm[MD2_BLOCK]; + MD2_INT state[MD2_BLOCK]; + } MD2_CTX; + +const char *MD2_options(void); +int MD2_Init(MD2_CTX *c); +int MD2_Update(MD2_CTX *c, const unsigned char *data, size_t len); +int MD2_Final(unsigned char *md, MD2_CTX *c); +unsigned char *MD2(const unsigned char *d, size_t n,unsigned char *md); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/md4.h b/mswin32/OpenSSL/include/openssl/md4.h new file mode 100755 index 000000000..5598c93a4 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/md4.h @@ -0,0 +1,117 @@ +/* crypto/md4/md4.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.] + */ + +#ifndef HEADER_MD4_H +#define HEADER_MD4_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_NO_MD4 +#error MD4 is disabled. +#endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD4_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! MD4_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__) +#define MD4_LONG unsigned long +#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +#define MD4_LONG unsigned long +#define MD4_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +#else +#define MD4_LONG unsigned int +#endif + +#define MD4_CBLOCK 64 +#define MD4_LBLOCK (MD4_CBLOCK/4) +#define MD4_DIGEST_LENGTH 16 + +typedef struct MD4state_st + { + MD4_LONG A,B,C,D; + MD4_LONG Nl,Nh; + MD4_LONG data[MD4_LBLOCK]; + unsigned int num; + } MD4_CTX; + +int MD4_Init(MD4_CTX *c); +int MD4_Update(MD4_CTX *c, const void *data, size_t len); +int MD4_Final(unsigned char *md, MD4_CTX *c); +unsigned char *MD4(const unsigned char *d, size_t n, unsigned char *md); +void MD4_Transform(MD4_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/md5.h b/mswin32/OpenSSL/include/openssl/md5.h new file mode 100755 index 000000000..dbdc0e1ab --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/md5.h @@ -0,0 +1,117 @@ +/* crypto/md5/md5.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.] + */ + +#ifndef HEADER_MD5_H +#define HEADER_MD5_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_NO_MD5 +#error MD5 is disabled. +#endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD5_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! MD5_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__) +#define MD5_LONG unsigned long +#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +#define MD5_LONG unsigned long +#define MD5_LONG_LOG2 3 +/* + * _CRAY note. I could declare short, but I have no idea what impact + * does it have on performance on none-T3E machines. I could declare + * int, but at least on C90 sizeof(int) can be chosen at compile time. + * So I've chosen long... + * + */ +#else +#define MD5_LONG unsigned int +#endif + +#define MD5_CBLOCK 64 +#define MD5_LBLOCK (MD5_CBLOCK/4) +#define MD5_DIGEST_LENGTH 16 + +typedef struct MD5state_st + { + MD5_LONG A,B,C,D; + MD5_LONG Nl,Nh; + MD5_LONG data[MD5_LBLOCK]; + unsigned int num; + } MD5_CTX; + +int MD5_Init(MD5_CTX *c); +int MD5_Update(MD5_CTX *c, const void *data, size_t len); +int MD5_Final(unsigned char *md, MD5_CTX *c); +unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); +void MD5_Transform(MD5_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/obj_mac.h b/mswin32/OpenSSL/include/openssl/obj_mac.h new file mode 100755 index 000000000..68b6e31a9 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/obj_mac.h @@ -0,0 +1,3433 @@ +/* crypto/objects/obj_mac.h */ + +/* THIS FILE IS GENERATED FROM objects.txt by objects.pl via the + * following command: + * perl objects.pl objects.txt obj_mac.num obj_mac.h + */ + +/* 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.] + */ + +#define SN_undef "UNDEF" +#define LN_undef "undefined" +#define NID_undef 0 +#define OBJ_undef 0L + +#define SN_itu_t "ITU-T" +#define LN_itu_t "itu-t" +#define NID_itu_t 645 +#define OBJ_itu_t 0L + +#define NID_ccitt 404 +#define OBJ_ccitt OBJ_itu_t + +#define SN_iso "ISO" +#define LN_iso "iso" +#define NID_iso 181 +#define OBJ_iso 1L + +#define SN_joint_iso_itu_t "JOINT-ISO-ITU-T" +#define LN_joint_iso_itu_t "joint-iso-itu-t" +#define NID_joint_iso_itu_t 646 +#define OBJ_joint_iso_itu_t 2L + +#define NID_joint_iso_ccitt 393 +#define OBJ_joint_iso_ccitt OBJ_joint_iso_itu_t + +#define SN_member_body "member-body" +#define LN_member_body "ISO Member Body" +#define NID_member_body 182 +#define OBJ_member_body OBJ_iso,2L + +#define SN_identified_organization "identified-organization" +#define NID_identified_organization 676 +#define OBJ_identified_organization OBJ_iso,3L + +#define SN_certicom_arc "certicom-arc" +#define NID_certicom_arc 677 +#define OBJ_certicom_arc OBJ_identified_organization,132L + +#define SN_international_organizations "international-organizations" +#define LN_international_organizations "International Organizations" +#define NID_international_organizations 647 +#define OBJ_international_organizations OBJ_joint_iso_itu_t,23L + +#define SN_wap "wap" +#define NID_wap 678 +#define OBJ_wap OBJ_international_organizations,43L + +#define SN_wap_wsg "wap-wsg" +#define NID_wap_wsg 679 +#define OBJ_wap_wsg OBJ_wap,13L + +#define SN_selected_attribute_types "selected-attribute-types" +#define LN_selected_attribute_types "Selected Attribute Types" +#define NID_selected_attribute_types 394 +#define OBJ_selected_attribute_types OBJ_joint_iso_itu_t,5L,1L,5L + +#define SN_clearance "clearance" +#define NID_clearance 395 +#define OBJ_clearance OBJ_selected_attribute_types,55L + +#define SN_ISO_US "ISO-US" +#define LN_ISO_US "ISO US Member Body" +#define NID_ISO_US 183 +#define OBJ_ISO_US OBJ_member_body,840L + +#define SN_X9_57 "X9-57" +#define LN_X9_57 "X9.57" +#define NID_X9_57 184 +#define OBJ_X9_57 OBJ_ISO_US,10040L + +#define SN_X9cm "X9cm" +#define LN_X9cm "X9.57 CM ?" +#define NID_X9cm 185 +#define OBJ_X9cm OBJ_X9_57,4L + +#define SN_dsa "DSA" +#define LN_dsa "dsaEncryption" +#define NID_dsa 116 +#define OBJ_dsa OBJ_X9cm,1L + +#define SN_dsaWithSHA1 "DSA-SHA1" +#define LN_dsaWithSHA1 "dsaWithSHA1" +#define NID_dsaWithSHA1 113 +#define OBJ_dsaWithSHA1 OBJ_X9cm,3L + +#define SN_ansi_X9_62 "ansi-X9-62" +#define LN_ansi_X9_62 "ANSI X9.62" +#define NID_ansi_X9_62 405 +#define OBJ_ansi_X9_62 OBJ_ISO_US,10045L + +#define OBJ_X9_62_id_fieldType OBJ_ansi_X9_62,1L + +#define SN_X9_62_prime_field "prime-field" +#define NID_X9_62_prime_field 406 +#define OBJ_X9_62_prime_field OBJ_X9_62_id_fieldType,1L + +#define SN_X9_62_characteristic_two_field "characteristic-two-field" +#define NID_X9_62_characteristic_two_field 407 +#define OBJ_X9_62_characteristic_two_field OBJ_X9_62_id_fieldType,2L + +#define SN_X9_62_id_characteristic_two_basis "id-characteristic-two-basis" +#define NID_X9_62_id_characteristic_two_basis 680 +#define OBJ_X9_62_id_characteristic_two_basis OBJ_X9_62_characteristic_two_field,3L + +#define SN_X9_62_onBasis "onBasis" +#define NID_X9_62_onBasis 681 +#define OBJ_X9_62_onBasis OBJ_X9_62_id_characteristic_two_basis,1L + +#define SN_X9_62_tpBasis "tpBasis" +#define NID_X9_62_tpBasis 682 +#define OBJ_X9_62_tpBasis OBJ_X9_62_id_characteristic_two_basis,2L + +#define SN_X9_62_ppBasis "ppBasis" +#define NID_X9_62_ppBasis 683 +#define OBJ_X9_62_ppBasis OBJ_X9_62_id_characteristic_two_basis,3L + +#define OBJ_X9_62_id_publicKeyType OBJ_ansi_X9_62,2L + +#define SN_X9_62_id_ecPublicKey "id-ecPublicKey" +#define NID_X9_62_id_ecPublicKey 408 +#define OBJ_X9_62_id_ecPublicKey OBJ_X9_62_id_publicKeyType,1L + +#define OBJ_X9_62_ellipticCurve OBJ_ansi_X9_62,3L + +#define OBJ_X9_62_c_TwoCurve OBJ_X9_62_ellipticCurve,0L + +#define SN_X9_62_c2pnb163v1 "c2pnb163v1" +#define NID_X9_62_c2pnb163v1 684 +#define OBJ_X9_62_c2pnb163v1 OBJ_X9_62_c_TwoCurve,1L + +#define SN_X9_62_c2pnb163v2 "c2pnb163v2" +#define NID_X9_62_c2pnb163v2 685 +#define OBJ_X9_62_c2pnb163v2 OBJ_X9_62_c_TwoCurve,2L + +#define SN_X9_62_c2pnb163v3 "c2pnb163v3" +#define NID_X9_62_c2pnb163v3 686 +#define OBJ_X9_62_c2pnb163v3 OBJ_X9_62_c_TwoCurve,3L + +#define SN_X9_62_c2pnb176v1 "c2pnb176v1" +#define NID_X9_62_c2pnb176v1 687 +#define OBJ_X9_62_c2pnb176v1 OBJ_X9_62_c_TwoCurve,4L + +#define SN_X9_62_c2tnb191v1 "c2tnb191v1" +#define NID_X9_62_c2tnb191v1 688 +#define OBJ_X9_62_c2tnb191v1 OBJ_X9_62_c_TwoCurve,5L + +#define SN_X9_62_c2tnb191v2 "c2tnb191v2" +#define NID_X9_62_c2tnb191v2 689 +#define OBJ_X9_62_c2tnb191v2 OBJ_X9_62_c_TwoCurve,6L + +#define SN_X9_62_c2tnb191v3 "c2tnb191v3" +#define NID_X9_62_c2tnb191v3 690 +#define OBJ_X9_62_c2tnb191v3 OBJ_X9_62_c_TwoCurve,7L + +#define SN_X9_62_c2onb191v4 "c2onb191v4" +#define NID_X9_62_c2onb191v4 691 +#define OBJ_X9_62_c2onb191v4 OBJ_X9_62_c_TwoCurve,8L + +#define SN_X9_62_c2onb191v5 "c2onb191v5" +#define NID_X9_62_c2onb191v5 692 +#define OBJ_X9_62_c2onb191v5 OBJ_X9_62_c_TwoCurve,9L + +#define SN_X9_62_c2pnb208w1 "c2pnb208w1" +#define NID_X9_62_c2pnb208w1 693 +#define OBJ_X9_62_c2pnb208w1 OBJ_X9_62_c_TwoCurve,10L + +#define SN_X9_62_c2tnb239v1 "c2tnb239v1" +#define NID_X9_62_c2tnb239v1 694 +#define OBJ_X9_62_c2tnb239v1 OBJ_X9_62_c_TwoCurve,11L + +#define SN_X9_62_c2tnb239v2 "c2tnb239v2" +#define NID_X9_62_c2tnb239v2 695 +#define OBJ_X9_62_c2tnb239v2 OBJ_X9_62_c_TwoCurve,12L + +#define SN_X9_62_c2tnb239v3 "c2tnb239v3" +#define NID_X9_62_c2tnb239v3 696 +#define OBJ_X9_62_c2tnb239v3 OBJ_X9_62_c_TwoCurve,13L + +#define SN_X9_62_c2onb239v4 "c2onb239v4" +#define NID_X9_62_c2onb239v4 697 +#define OBJ_X9_62_c2onb239v4 OBJ_X9_62_c_TwoCurve,14L + +#define SN_X9_62_c2onb239v5 "c2onb239v5" +#define NID_X9_62_c2onb239v5 698 +#define OBJ_X9_62_c2onb239v5 OBJ_X9_62_c_TwoCurve,15L + +#define SN_X9_62_c2pnb272w1 "c2pnb272w1" +#define NID_X9_62_c2pnb272w1 699 +#define OBJ_X9_62_c2pnb272w1 OBJ_X9_62_c_TwoCurve,16L + +#define SN_X9_62_c2pnb304w1 "c2pnb304w1" +#define NID_X9_62_c2pnb304w1 700 +#define OBJ_X9_62_c2pnb304w1 OBJ_X9_62_c_TwoCurve,17L + +#define SN_X9_62_c2tnb359v1 "c2tnb359v1" +#define NID_X9_62_c2tnb359v1 701 +#define OBJ_X9_62_c2tnb359v1 OBJ_X9_62_c_TwoCurve,18L + +#define SN_X9_62_c2pnb368w1 "c2pnb368w1" +#define NID_X9_62_c2pnb368w1 702 +#define OBJ_X9_62_c2pnb368w1 OBJ_X9_62_c_TwoCurve,19L + +#define SN_X9_62_c2tnb431r1 "c2tnb431r1" +#define NID_X9_62_c2tnb431r1 703 +#define OBJ_X9_62_c2tnb431r1 OBJ_X9_62_c_TwoCurve,20L + +#define OBJ_X9_62_primeCurve OBJ_X9_62_ellipticCurve,1L + +#define SN_X9_62_prime192v1 "prime192v1" +#define NID_X9_62_prime192v1 409 +#define OBJ_X9_62_prime192v1 OBJ_X9_62_primeCurve,1L + +#define SN_X9_62_prime192v2 "prime192v2" +#define NID_X9_62_prime192v2 410 +#define OBJ_X9_62_prime192v2 OBJ_X9_62_primeCurve,2L + +#define SN_X9_62_prime192v3 "prime192v3" +#define NID_X9_62_prime192v3 411 +#define OBJ_X9_62_prime192v3 OBJ_X9_62_primeCurve,3L + +#define SN_X9_62_prime239v1 "prime239v1" +#define NID_X9_62_prime239v1 412 +#define OBJ_X9_62_prime239v1 OBJ_X9_62_primeCurve,4L + +#define SN_X9_62_prime239v2 "prime239v2" +#define NID_X9_62_prime239v2 413 +#define OBJ_X9_62_prime239v2 OBJ_X9_62_primeCurve,5L + +#define SN_X9_62_prime239v3 "prime239v3" +#define NID_X9_62_prime239v3 414 +#define OBJ_X9_62_prime239v3 OBJ_X9_62_primeCurve,6L + +#define SN_X9_62_prime256v1 "prime256v1" +#define NID_X9_62_prime256v1 415 +#define OBJ_X9_62_prime256v1 OBJ_X9_62_primeCurve,7L + +#define OBJ_X9_62_id_ecSigType OBJ_ansi_X9_62,4L + +#define SN_ecdsa_with_SHA1 "ecdsa-with-SHA1" +#define NID_ecdsa_with_SHA1 416 +#define OBJ_ecdsa_with_SHA1 OBJ_X9_62_id_ecSigType,1L + +#define OBJ_secg_ellipticCurve OBJ_certicom_arc,0L + +#define SN_secp112r1 "secp112r1" +#define NID_secp112r1 704 +#define OBJ_secp112r1 OBJ_secg_ellipticCurve,6L + +#define SN_secp112r2 "secp112r2" +#define NID_secp112r2 705 +#define OBJ_secp112r2 OBJ_secg_ellipticCurve,7L + +#define SN_secp128r1 "secp128r1" +#define NID_secp128r1 706 +#define OBJ_secp128r1 OBJ_secg_ellipticCurve,28L + +#define SN_secp128r2 "secp128r2" +#define NID_secp128r2 707 +#define OBJ_secp128r2 OBJ_secg_ellipticCurve,29L + +#define SN_secp160k1 "secp160k1" +#define NID_secp160k1 708 +#define OBJ_secp160k1 OBJ_secg_ellipticCurve,9L + +#define SN_secp160r1 "secp160r1" +#define NID_secp160r1 709 +#define OBJ_secp160r1 OBJ_secg_ellipticCurve,8L + +#define SN_secp160r2 "secp160r2" +#define NID_secp160r2 710 +#define OBJ_secp160r2 OBJ_secg_ellipticCurve,30L + +#define SN_secp192k1 "secp192k1" +#define NID_secp192k1 711 +#define OBJ_secp192k1 OBJ_secg_ellipticCurve,31L + +#define SN_secp224k1 "secp224k1" +#define NID_secp224k1 712 +#define OBJ_secp224k1 OBJ_secg_ellipticCurve,32L + +#define SN_secp224r1 "secp224r1" +#define NID_secp224r1 713 +#define OBJ_secp224r1 OBJ_secg_ellipticCurve,33L + +#define SN_secp256k1 "secp256k1" +#define NID_secp256k1 714 +#define OBJ_secp256k1 OBJ_secg_ellipticCurve,10L + +#define SN_secp384r1 "secp384r1" +#define NID_secp384r1 715 +#define OBJ_secp384r1 OBJ_secg_ellipticCurve,34L + +#define SN_secp521r1 "secp521r1" +#define NID_secp521r1 716 +#define OBJ_secp521r1 OBJ_secg_ellipticCurve,35L + +#define SN_sect113r1 "sect113r1" +#define NID_sect113r1 717 +#define OBJ_sect113r1 OBJ_secg_ellipticCurve,4L + +#define SN_sect113r2 "sect113r2" +#define NID_sect113r2 718 +#define OBJ_sect113r2 OBJ_secg_ellipticCurve,5L + +#define SN_sect131r1 "sect131r1" +#define NID_sect131r1 719 +#define OBJ_sect131r1 OBJ_secg_ellipticCurve,22L + +#define SN_sect131r2 "sect131r2" +#define NID_sect131r2 720 +#define OBJ_sect131r2 OBJ_secg_ellipticCurve,23L + +#define SN_sect163k1 "sect163k1" +#define NID_sect163k1 721 +#define OBJ_sect163k1 OBJ_secg_ellipticCurve,1L + +#define SN_sect163r1 "sect163r1" +#define NID_sect163r1 722 +#define OBJ_sect163r1 OBJ_secg_ellipticCurve,2L + +#define SN_sect163r2 "sect163r2" +#define NID_sect163r2 723 +#define OBJ_sect163r2 OBJ_secg_ellipticCurve,15L + +#define SN_sect193r1 "sect193r1" +#define NID_sect193r1 724 +#define OBJ_sect193r1 OBJ_secg_ellipticCurve,24L + +#define SN_sect193r2 "sect193r2" +#define NID_sect193r2 725 +#define OBJ_sect193r2 OBJ_secg_ellipticCurve,25L + +#define SN_sect233k1 "sect233k1" +#define NID_sect233k1 726 +#define OBJ_sect233k1 OBJ_secg_ellipticCurve,26L + +#define SN_sect233r1 "sect233r1" +#define NID_sect233r1 727 +#define OBJ_sect233r1 OBJ_secg_ellipticCurve,27L + +#define SN_sect239k1 "sect239k1" +#define NID_sect239k1 728 +#define OBJ_sect239k1 OBJ_secg_ellipticCurve,3L + +#define SN_sect283k1 "sect283k1" +#define NID_sect283k1 729 +#define OBJ_sect283k1 OBJ_secg_ellipticCurve,16L + +#define SN_sect283r1 "sect283r1" +#define NID_sect283r1 730 +#define OBJ_sect283r1 OBJ_secg_ellipticCurve,17L + +#define SN_sect409k1 "sect409k1" +#define NID_sect409k1 731 +#define OBJ_sect409k1 OBJ_secg_ellipticCurve,36L + +#define SN_sect409r1 "sect409r1" +#define NID_sect409r1 732 +#define OBJ_sect409r1 OBJ_secg_ellipticCurve,37L + +#define SN_sect571k1 "sect571k1" +#define NID_sect571k1 733 +#define OBJ_sect571k1 OBJ_secg_ellipticCurve,38L + +#define SN_sect571r1 "sect571r1" +#define NID_sect571r1 734 +#define OBJ_sect571r1 OBJ_secg_ellipticCurve,39L + +#define OBJ_wap_wsg_idm_ecid OBJ_wap_wsg,4L + +#define SN_wap_wsg_idm_ecid_wtls1 "wap-wsg-idm-ecid-wtls1" +#define NID_wap_wsg_idm_ecid_wtls1 735 +#define OBJ_wap_wsg_idm_ecid_wtls1 OBJ_wap_wsg_idm_ecid,1L + +#define SN_wap_wsg_idm_ecid_wtls3 "wap-wsg-idm-ecid-wtls3" +#define NID_wap_wsg_idm_ecid_wtls3 736 +#define OBJ_wap_wsg_idm_ecid_wtls3 OBJ_wap_wsg_idm_ecid,3L + +#define SN_wap_wsg_idm_ecid_wtls4 "wap-wsg-idm-ecid-wtls4" +#define NID_wap_wsg_idm_ecid_wtls4 737 +#define OBJ_wap_wsg_idm_ecid_wtls4 OBJ_wap_wsg_idm_ecid,4L + +#define SN_wap_wsg_idm_ecid_wtls5 "wap-wsg-idm-ecid-wtls5" +#define NID_wap_wsg_idm_ecid_wtls5 738 +#define OBJ_wap_wsg_idm_ecid_wtls5 OBJ_wap_wsg_idm_ecid,5L + +#define SN_wap_wsg_idm_ecid_wtls6 "wap-wsg-idm-ecid-wtls6" +#define NID_wap_wsg_idm_ecid_wtls6 739 +#define OBJ_wap_wsg_idm_ecid_wtls6 OBJ_wap_wsg_idm_ecid,6L + +#define SN_wap_wsg_idm_ecid_wtls7 "wap-wsg-idm-ecid-wtls7" +#define NID_wap_wsg_idm_ecid_wtls7 740 +#define OBJ_wap_wsg_idm_ecid_wtls7 OBJ_wap_wsg_idm_ecid,7L + +#define SN_wap_wsg_idm_ecid_wtls8 "wap-wsg-idm-ecid-wtls8" +#define NID_wap_wsg_idm_ecid_wtls8 741 +#define OBJ_wap_wsg_idm_ecid_wtls8 OBJ_wap_wsg_idm_ecid,8L + +#define SN_wap_wsg_idm_ecid_wtls9 "wap-wsg-idm-ecid-wtls9" +#define NID_wap_wsg_idm_ecid_wtls9 742 +#define OBJ_wap_wsg_idm_ecid_wtls9 OBJ_wap_wsg_idm_ecid,9L + +#define SN_wap_wsg_idm_ecid_wtls10 "wap-wsg-idm-ecid-wtls10" +#define NID_wap_wsg_idm_ecid_wtls10 743 +#define OBJ_wap_wsg_idm_ecid_wtls10 OBJ_wap_wsg_idm_ecid,10L + +#define SN_wap_wsg_idm_ecid_wtls11 "wap-wsg-idm-ecid-wtls11" +#define NID_wap_wsg_idm_ecid_wtls11 744 +#define OBJ_wap_wsg_idm_ecid_wtls11 OBJ_wap_wsg_idm_ecid,11L + +#define SN_wap_wsg_idm_ecid_wtls12 "wap-wsg-idm-ecid-wtls12" +#define NID_wap_wsg_idm_ecid_wtls12 745 +#define OBJ_wap_wsg_idm_ecid_wtls12 OBJ_wap_wsg_idm_ecid,12L + +#define SN_cast5_cbc "CAST5-CBC" +#define LN_cast5_cbc "cast5-cbc" +#define NID_cast5_cbc 108 +#define OBJ_cast5_cbc OBJ_ISO_US,113533L,7L,66L,10L + +#define SN_cast5_ecb "CAST5-ECB" +#define LN_cast5_ecb "cast5-ecb" +#define NID_cast5_ecb 109 + +#define SN_cast5_cfb64 "CAST5-CFB" +#define LN_cast5_cfb64 "cast5-cfb" +#define NID_cast5_cfb64 110 + +#define SN_cast5_ofb64 "CAST5-OFB" +#define LN_cast5_ofb64 "cast5-ofb" +#define NID_cast5_ofb64 111 + +#define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +#define NID_pbeWithMD5AndCast5_CBC 112 +#define OBJ_pbeWithMD5AndCast5_CBC OBJ_ISO_US,113533L,7L,66L,12L + +#define SN_rsadsi "rsadsi" +#define LN_rsadsi "RSA Data Security, Inc." +#define NID_rsadsi 1 +#define OBJ_rsadsi OBJ_ISO_US,113549L + +#define SN_pkcs "pkcs" +#define LN_pkcs "RSA Data Security, Inc. PKCS" +#define NID_pkcs 2 +#define OBJ_pkcs OBJ_rsadsi,1L + +#define SN_pkcs1 "pkcs1" +#define NID_pkcs1 186 +#define OBJ_pkcs1 OBJ_pkcs,1L + +#define LN_rsaEncryption "rsaEncryption" +#define NID_rsaEncryption 6 +#define OBJ_rsaEncryption OBJ_pkcs1,1L + +#define SN_md2WithRSAEncryption "RSA-MD2" +#define LN_md2WithRSAEncryption "md2WithRSAEncryption" +#define NID_md2WithRSAEncryption 7 +#define OBJ_md2WithRSAEncryption OBJ_pkcs1,2L + +#define SN_md4WithRSAEncryption "RSA-MD4" +#define LN_md4WithRSAEncryption "md4WithRSAEncryption" +#define NID_md4WithRSAEncryption 396 +#define OBJ_md4WithRSAEncryption OBJ_pkcs1,3L + +#define SN_md5WithRSAEncryption "RSA-MD5" +#define LN_md5WithRSAEncryption "md5WithRSAEncryption" +#define NID_md5WithRSAEncryption 8 +#define OBJ_md5WithRSAEncryption OBJ_pkcs1,4L + +#define SN_sha1WithRSAEncryption "RSA-SHA1" +#define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +#define NID_sha1WithRSAEncryption 65 +#define OBJ_sha1WithRSAEncryption OBJ_pkcs1,5L + +#define SN_sha256WithRSAEncryption "RSA-SHA256" +#define LN_sha256WithRSAEncryption "sha256WithRSAEncryption" +#define NID_sha256WithRSAEncryption 668 +#define OBJ_sha256WithRSAEncryption OBJ_pkcs1,11L + +#define SN_sha384WithRSAEncryption "RSA-SHA384" +#define LN_sha384WithRSAEncryption "sha384WithRSAEncryption" +#define NID_sha384WithRSAEncryption 669 +#define OBJ_sha384WithRSAEncryption OBJ_pkcs1,12L + +#define SN_sha512WithRSAEncryption "RSA-SHA512" +#define LN_sha512WithRSAEncryption "sha512WithRSAEncryption" +#define NID_sha512WithRSAEncryption 670 +#define OBJ_sha512WithRSAEncryption OBJ_pkcs1,13L + +#define SN_sha224WithRSAEncryption "RSA-SHA224" +#define LN_sha224WithRSAEncryption "sha224WithRSAEncryption" +#define NID_sha224WithRSAEncryption 671 +#define OBJ_sha224WithRSAEncryption OBJ_pkcs1,14L + +#define SN_pkcs3 "pkcs3" +#define NID_pkcs3 27 +#define OBJ_pkcs3 OBJ_pkcs,3L + +#define LN_dhKeyAgreement "dhKeyAgreement" +#define NID_dhKeyAgreement 28 +#define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +#define SN_pkcs5 "pkcs5" +#define NID_pkcs5 187 +#define OBJ_pkcs5 OBJ_pkcs,5L + +#define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +#define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +#define NID_pbeWithMD2AndDES_CBC 9 +#define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs5,1L + +#define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +#define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +#define NID_pbeWithMD5AndDES_CBC 10 +#define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs5,3L + +#define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +#define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +#define NID_pbeWithMD2AndRC2_CBC 168 +#define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs5,4L + +#define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +#define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +#define NID_pbeWithMD5AndRC2_CBC 169 +#define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs5,6L + +#define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +#define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +#define NID_pbeWithSHA1AndDES_CBC 170 +#define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs5,10L + +#define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +#define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +#define NID_pbeWithSHA1AndRC2_CBC 68 +#define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs5,11L + +#define LN_id_pbkdf2 "PBKDF2" +#define NID_id_pbkdf2 69 +#define OBJ_id_pbkdf2 OBJ_pkcs5,12L + +#define LN_pbes2 "PBES2" +#define NID_pbes2 161 +#define OBJ_pbes2 OBJ_pkcs5,13L + +#define LN_pbmac1 "PBMAC1" +#define NID_pbmac1 162 +#define OBJ_pbmac1 OBJ_pkcs5,14L + +#define SN_pkcs7 "pkcs7" +#define NID_pkcs7 20 +#define OBJ_pkcs7 OBJ_pkcs,7L + +#define LN_pkcs7_data "pkcs7-data" +#define NID_pkcs7_data 21 +#define OBJ_pkcs7_data OBJ_pkcs7,1L + +#define LN_pkcs7_signed "pkcs7-signedData" +#define NID_pkcs7_signed 22 +#define OBJ_pkcs7_signed OBJ_pkcs7,2L + +#define LN_pkcs7_enveloped "pkcs7-envelopedData" +#define NID_pkcs7_enveloped 23 +#define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +#define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +#define NID_pkcs7_signedAndEnveloped 24 +#define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +#define LN_pkcs7_digest "pkcs7-digestData" +#define NID_pkcs7_digest 25 +#define OBJ_pkcs7_digest OBJ_pkcs7,5L + +#define LN_pkcs7_encrypted "pkcs7-encryptedData" +#define NID_pkcs7_encrypted 26 +#define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +#define SN_pkcs9 "pkcs9" +#define NID_pkcs9 47 +#define OBJ_pkcs9 OBJ_pkcs,9L + +#define LN_pkcs9_emailAddress "emailAddress" +#define NID_pkcs9_emailAddress 48 +#define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +#define LN_pkcs9_unstructuredName "unstructuredName" +#define NID_pkcs9_unstructuredName 49 +#define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +#define LN_pkcs9_contentType "contentType" +#define NID_pkcs9_contentType 50 +#define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +#define LN_pkcs9_messageDigest "messageDigest" +#define NID_pkcs9_messageDigest 51 +#define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +#define LN_pkcs9_signingTime "signingTime" +#define NID_pkcs9_signingTime 52 +#define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +#define LN_pkcs9_countersignature "countersignature" +#define NID_pkcs9_countersignature 53 +#define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +#define LN_pkcs9_challengePassword "challengePassword" +#define NID_pkcs9_challengePassword 54 +#define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +#define LN_pkcs9_unstructuredAddress "unstructuredAddress" +#define NID_pkcs9_unstructuredAddress 55 +#define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +#define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +#define NID_pkcs9_extCertAttributes 56 +#define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +#define SN_ext_req "extReq" +#define LN_ext_req "Extension Request" +#define NID_ext_req 172 +#define OBJ_ext_req OBJ_pkcs9,14L + +#define SN_SMIMECapabilities "SMIME-CAPS" +#define LN_SMIMECapabilities "S/MIME Capabilities" +#define NID_SMIMECapabilities 167 +#define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +#define SN_SMIME "SMIME" +#define LN_SMIME "S/MIME" +#define NID_SMIME 188 +#define OBJ_SMIME OBJ_pkcs9,16L + +#define SN_id_smime_mod "id-smime-mod" +#define NID_id_smime_mod 189 +#define OBJ_id_smime_mod OBJ_SMIME,0L + +#define SN_id_smime_ct "id-smime-ct" +#define NID_id_smime_ct 190 +#define OBJ_id_smime_ct OBJ_SMIME,1L + +#define SN_id_smime_aa "id-smime-aa" +#define NID_id_smime_aa 191 +#define OBJ_id_smime_aa OBJ_SMIME,2L + +#define SN_id_smime_alg "id-smime-alg" +#define NID_id_smime_alg 192 +#define OBJ_id_smime_alg OBJ_SMIME,3L + +#define SN_id_smime_cd "id-smime-cd" +#define NID_id_smime_cd 193 +#define OBJ_id_smime_cd OBJ_SMIME,4L + +#define SN_id_smime_spq "id-smime-spq" +#define NID_id_smime_spq 194 +#define OBJ_id_smime_spq OBJ_SMIME,5L + +#define SN_id_smime_cti "id-smime-cti" +#define NID_id_smime_cti 195 +#define OBJ_id_smime_cti OBJ_SMIME,6L + +#define SN_id_smime_mod_cms "id-smime-mod-cms" +#define NID_id_smime_mod_cms 196 +#define OBJ_id_smime_mod_cms OBJ_id_smime_mod,1L + +#define SN_id_smime_mod_ess "id-smime-mod-ess" +#define NID_id_smime_mod_ess 197 +#define OBJ_id_smime_mod_ess OBJ_id_smime_mod,2L + +#define SN_id_smime_mod_oid "id-smime-mod-oid" +#define NID_id_smime_mod_oid 198 +#define OBJ_id_smime_mod_oid OBJ_id_smime_mod,3L + +#define SN_id_smime_mod_msg_v3 "id-smime-mod-msg-v3" +#define NID_id_smime_mod_msg_v3 199 +#define OBJ_id_smime_mod_msg_v3 OBJ_id_smime_mod,4L + +#define SN_id_smime_mod_ets_eSignature_88 "id-smime-mod-ets-eSignature-88" +#define NID_id_smime_mod_ets_eSignature_88 200 +#define OBJ_id_smime_mod_ets_eSignature_88 OBJ_id_smime_mod,5L + +#define SN_id_smime_mod_ets_eSignature_97 "id-smime-mod-ets-eSignature-97" +#define NID_id_smime_mod_ets_eSignature_97 201 +#define OBJ_id_smime_mod_ets_eSignature_97 OBJ_id_smime_mod,6L + +#define SN_id_smime_mod_ets_eSigPolicy_88 "id-smime-mod-ets-eSigPolicy-88" +#define NID_id_smime_mod_ets_eSigPolicy_88 202 +#define OBJ_id_smime_mod_ets_eSigPolicy_88 OBJ_id_smime_mod,7L + +#define SN_id_smime_mod_ets_eSigPolicy_97 "id-smime-mod-ets-eSigPolicy-97" +#define NID_id_smime_mod_ets_eSigPolicy_97 203 +#define OBJ_id_smime_mod_ets_eSigPolicy_97 OBJ_id_smime_mod,8L + +#define SN_id_smime_ct_receipt "id-smime-ct-receipt" +#define NID_id_smime_ct_receipt 204 +#define OBJ_id_smime_ct_receipt OBJ_id_smime_ct,1L + +#define SN_id_smime_ct_authData "id-smime-ct-authData" +#define NID_id_smime_ct_authData 205 +#define OBJ_id_smime_ct_authData OBJ_id_smime_ct,2L + +#define SN_id_smime_ct_publishCert "id-smime-ct-publishCert" +#define NID_id_smime_ct_publishCert 206 +#define OBJ_id_smime_ct_publishCert OBJ_id_smime_ct,3L + +#define SN_id_smime_ct_TSTInfo "id-smime-ct-TSTInfo" +#define NID_id_smime_ct_TSTInfo 207 +#define OBJ_id_smime_ct_TSTInfo OBJ_id_smime_ct,4L + +#define SN_id_smime_ct_TDTInfo "id-smime-ct-TDTInfo" +#define NID_id_smime_ct_TDTInfo 208 +#define OBJ_id_smime_ct_TDTInfo OBJ_id_smime_ct,5L + +#define SN_id_smime_ct_contentInfo "id-smime-ct-contentInfo" +#define NID_id_smime_ct_contentInfo 209 +#define OBJ_id_smime_ct_contentInfo OBJ_id_smime_ct,6L + +#define SN_id_smime_ct_DVCSRequestData "id-smime-ct-DVCSRequestData" +#define NID_id_smime_ct_DVCSRequestData 210 +#define OBJ_id_smime_ct_DVCSRequestData OBJ_id_smime_ct,7L + +#define SN_id_smime_ct_DVCSResponseData "id-smime-ct-DVCSResponseData" +#define NID_id_smime_ct_DVCSResponseData 211 +#define OBJ_id_smime_ct_DVCSResponseData OBJ_id_smime_ct,8L + +#define SN_id_smime_aa_receiptRequest "id-smime-aa-receiptRequest" +#define NID_id_smime_aa_receiptRequest 212 +#define OBJ_id_smime_aa_receiptRequest OBJ_id_smime_aa,1L + +#define SN_id_smime_aa_securityLabel "id-smime-aa-securityLabel" +#define NID_id_smime_aa_securityLabel 213 +#define OBJ_id_smime_aa_securityLabel OBJ_id_smime_aa,2L + +#define SN_id_smime_aa_mlExpandHistory "id-smime-aa-mlExpandHistory" +#define NID_id_smime_aa_mlExpandHistory 214 +#define OBJ_id_smime_aa_mlExpandHistory OBJ_id_smime_aa,3L + +#define SN_id_smime_aa_contentHint "id-smime-aa-contentHint" +#define NID_id_smime_aa_contentHint 215 +#define OBJ_id_smime_aa_contentHint OBJ_id_smime_aa,4L + +#define SN_id_smime_aa_msgSigDigest "id-smime-aa-msgSigDigest" +#define NID_id_smime_aa_msgSigDigest 216 +#define OBJ_id_smime_aa_msgSigDigest OBJ_id_smime_aa,5L + +#define SN_id_smime_aa_encapContentType "id-smime-aa-encapContentType" +#define NID_id_smime_aa_encapContentType 217 +#define OBJ_id_smime_aa_encapContentType OBJ_id_smime_aa,6L + +#define SN_id_smime_aa_contentIdentifier "id-smime-aa-contentIdentifier" +#define NID_id_smime_aa_contentIdentifier 218 +#define OBJ_id_smime_aa_contentIdentifier OBJ_id_smime_aa,7L + +#define SN_id_smime_aa_macValue "id-smime-aa-macValue" +#define NID_id_smime_aa_macValue 219 +#define OBJ_id_smime_aa_macValue OBJ_id_smime_aa,8L + +#define SN_id_smime_aa_equivalentLabels "id-smime-aa-equivalentLabels" +#define NID_id_smime_aa_equivalentLabels 220 +#define OBJ_id_smime_aa_equivalentLabels OBJ_id_smime_aa,9L + +#define SN_id_smime_aa_contentReference "id-smime-aa-contentReference" +#define NID_id_smime_aa_contentReference 221 +#define OBJ_id_smime_aa_contentReference OBJ_id_smime_aa,10L + +#define SN_id_smime_aa_encrypKeyPref "id-smime-aa-encrypKeyPref" +#define NID_id_smime_aa_encrypKeyPref 222 +#define OBJ_id_smime_aa_encrypKeyPref OBJ_id_smime_aa,11L + +#define SN_id_smime_aa_signingCertificate "id-smime-aa-signingCertificate" +#define NID_id_smime_aa_signingCertificate 223 +#define OBJ_id_smime_aa_signingCertificate OBJ_id_smime_aa,12L + +#define SN_id_smime_aa_smimeEncryptCerts "id-smime-aa-smimeEncryptCerts" +#define NID_id_smime_aa_smimeEncryptCerts 224 +#define OBJ_id_smime_aa_smimeEncryptCerts OBJ_id_smime_aa,13L + +#define SN_id_smime_aa_timeStampToken "id-smime-aa-timeStampToken" +#define NID_id_smime_aa_timeStampToken 225 +#define OBJ_id_smime_aa_timeStampToken OBJ_id_smime_aa,14L + +#define SN_id_smime_aa_ets_sigPolicyId "id-smime-aa-ets-sigPolicyId" +#define NID_id_smime_aa_ets_sigPolicyId 226 +#define OBJ_id_smime_aa_ets_sigPolicyId OBJ_id_smime_aa,15L + +#define SN_id_smime_aa_ets_commitmentType "id-smime-aa-ets-commitmentType" +#define NID_id_smime_aa_ets_commitmentType 227 +#define OBJ_id_smime_aa_ets_commitmentType OBJ_id_smime_aa,16L + +#define SN_id_smime_aa_ets_signerLocation "id-smime-aa-ets-signerLocation" +#define NID_id_smime_aa_ets_signerLocation 228 +#define OBJ_id_smime_aa_ets_signerLocation OBJ_id_smime_aa,17L + +#define SN_id_smime_aa_ets_signerAttr "id-smime-aa-ets-signerAttr" +#define NID_id_smime_aa_ets_signerAttr 229 +#define OBJ_id_smime_aa_ets_signerAttr OBJ_id_smime_aa,18L + +#define SN_id_smime_aa_ets_otherSigCert "id-smime-aa-ets-otherSigCert" +#define NID_id_smime_aa_ets_otherSigCert 230 +#define OBJ_id_smime_aa_ets_otherSigCert OBJ_id_smime_aa,19L + +#define SN_id_smime_aa_ets_contentTimestamp "id-smime-aa-ets-contentTimestamp" +#define NID_id_smime_aa_ets_contentTimestamp 231 +#define OBJ_id_smime_aa_ets_contentTimestamp OBJ_id_smime_aa,20L + +#define SN_id_smime_aa_ets_CertificateRefs "id-smime-aa-ets-CertificateRefs" +#define NID_id_smime_aa_ets_CertificateRefs 232 +#define OBJ_id_smime_aa_ets_CertificateRefs OBJ_id_smime_aa,21L + +#define SN_id_smime_aa_ets_RevocationRefs "id-smime-aa-ets-RevocationRefs" +#define NID_id_smime_aa_ets_RevocationRefs 233 +#define OBJ_id_smime_aa_ets_RevocationRefs OBJ_id_smime_aa,22L + +#define SN_id_smime_aa_ets_certValues "id-smime-aa-ets-certValues" +#define NID_id_smime_aa_ets_certValues 234 +#define OBJ_id_smime_aa_ets_certValues OBJ_id_smime_aa,23L + +#define SN_id_smime_aa_ets_revocationValues "id-smime-aa-ets-revocationValues" +#define NID_id_smime_aa_ets_revocationValues 235 +#define OBJ_id_smime_aa_ets_revocationValues OBJ_id_smime_aa,24L + +#define SN_id_smime_aa_ets_escTimeStamp "id-smime-aa-ets-escTimeStamp" +#define NID_id_smime_aa_ets_escTimeStamp 236 +#define OBJ_id_smime_aa_ets_escTimeStamp OBJ_id_smime_aa,25L + +#define SN_id_smime_aa_ets_certCRLTimestamp "id-smime-aa-ets-certCRLTimestamp" +#define NID_id_smime_aa_ets_certCRLTimestamp 237 +#define OBJ_id_smime_aa_ets_certCRLTimestamp OBJ_id_smime_aa,26L + +#define SN_id_smime_aa_ets_archiveTimeStamp "id-smime-aa-ets-archiveTimeStamp" +#define NID_id_smime_aa_ets_archiveTimeStamp 238 +#define OBJ_id_smime_aa_ets_archiveTimeStamp OBJ_id_smime_aa,27L + +#define SN_id_smime_aa_signatureType "id-smime-aa-signatureType" +#define NID_id_smime_aa_signatureType 239 +#define OBJ_id_smime_aa_signatureType OBJ_id_smime_aa,28L + +#define SN_id_smime_aa_dvcs_dvc "id-smime-aa-dvcs-dvc" +#define NID_id_smime_aa_dvcs_dvc 240 +#define OBJ_id_smime_aa_dvcs_dvc OBJ_id_smime_aa,29L + +#define SN_id_smime_alg_ESDHwith3DES "id-smime-alg-ESDHwith3DES" +#define NID_id_smime_alg_ESDHwith3DES 241 +#define OBJ_id_smime_alg_ESDHwith3DES OBJ_id_smime_alg,1L + +#define SN_id_smime_alg_ESDHwithRC2 "id-smime-alg-ESDHwithRC2" +#define NID_id_smime_alg_ESDHwithRC2 242 +#define OBJ_id_smime_alg_ESDHwithRC2 OBJ_id_smime_alg,2L + +#define SN_id_smime_alg_3DESwrap "id-smime-alg-3DESwrap" +#define NID_id_smime_alg_3DESwrap 243 +#define OBJ_id_smime_alg_3DESwrap OBJ_id_smime_alg,3L + +#define SN_id_smime_alg_RC2wrap "id-smime-alg-RC2wrap" +#define NID_id_smime_alg_RC2wrap 244 +#define OBJ_id_smime_alg_RC2wrap OBJ_id_smime_alg,4L + +#define SN_id_smime_alg_ESDH "id-smime-alg-ESDH" +#define NID_id_smime_alg_ESDH 245 +#define OBJ_id_smime_alg_ESDH OBJ_id_smime_alg,5L + +#define SN_id_smime_alg_CMS3DESwrap "id-smime-alg-CMS3DESwrap" +#define NID_id_smime_alg_CMS3DESwrap 246 +#define OBJ_id_smime_alg_CMS3DESwrap OBJ_id_smime_alg,6L + +#define SN_id_smime_alg_CMSRC2wrap "id-smime-alg-CMSRC2wrap" +#define NID_id_smime_alg_CMSRC2wrap 247 +#define OBJ_id_smime_alg_CMSRC2wrap OBJ_id_smime_alg,7L + +#define SN_id_smime_cd_ldap "id-smime-cd-ldap" +#define NID_id_smime_cd_ldap 248 +#define OBJ_id_smime_cd_ldap OBJ_id_smime_cd,1L + +#define SN_id_smime_spq_ets_sqt_uri "id-smime-spq-ets-sqt-uri" +#define NID_id_smime_spq_ets_sqt_uri 249 +#define OBJ_id_smime_spq_ets_sqt_uri OBJ_id_smime_spq,1L + +#define SN_id_smime_spq_ets_sqt_unotice "id-smime-spq-ets-sqt-unotice" +#define NID_id_smime_spq_ets_sqt_unotice 250 +#define OBJ_id_smime_spq_ets_sqt_unotice OBJ_id_smime_spq,2L + +#define SN_id_smime_cti_ets_proofOfOrigin "id-smime-cti-ets-proofOfOrigin" +#define NID_id_smime_cti_ets_proofOfOrigin 251 +#define OBJ_id_smime_cti_ets_proofOfOrigin OBJ_id_smime_cti,1L + +#define SN_id_smime_cti_ets_proofOfReceipt "id-smime-cti-ets-proofOfReceipt" +#define NID_id_smime_cti_ets_proofOfReceipt 252 +#define OBJ_id_smime_cti_ets_proofOfReceipt OBJ_id_smime_cti,2L + +#define SN_id_smime_cti_ets_proofOfDelivery "id-smime-cti-ets-proofOfDelivery" +#define NID_id_smime_cti_ets_proofOfDelivery 253 +#define OBJ_id_smime_cti_ets_proofOfDelivery OBJ_id_smime_cti,3L + +#define SN_id_smime_cti_ets_proofOfSender "id-smime-cti-ets-proofOfSender" +#define NID_id_smime_cti_ets_proofOfSender 254 +#define OBJ_id_smime_cti_ets_proofOfSender OBJ_id_smime_cti,4L + +#define SN_id_smime_cti_ets_proofOfApproval "id-smime-cti-ets-proofOfApproval" +#define NID_id_smime_cti_ets_proofOfApproval 255 +#define OBJ_id_smime_cti_ets_proofOfApproval OBJ_id_smime_cti,5L + +#define SN_id_smime_cti_ets_proofOfCreation "id-smime-cti-ets-proofOfCreation" +#define NID_id_smime_cti_ets_proofOfCreation 256 +#define OBJ_id_smime_cti_ets_proofOfCreation OBJ_id_smime_cti,6L + +#define LN_friendlyName "friendlyName" +#define NID_friendlyName 156 +#define OBJ_friendlyName OBJ_pkcs9,20L + +#define LN_localKeyID "localKeyID" +#define NID_localKeyID 157 +#define OBJ_localKeyID OBJ_pkcs9,21L + +#define SN_ms_csp_name "CSPName" +#define LN_ms_csp_name "Microsoft CSP Name" +#define NID_ms_csp_name 417 +#define OBJ_ms_csp_name 1L,3L,6L,1L,4L,1L,311L,17L,1L + +#define OBJ_certTypes OBJ_pkcs9,22L + +#define LN_x509Certificate "x509Certificate" +#define NID_x509Certificate 158 +#define OBJ_x509Certificate OBJ_certTypes,1L + +#define LN_sdsiCertificate "sdsiCertificate" +#define NID_sdsiCertificate 159 +#define OBJ_sdsiCertificate OBJ_certTypes,2L + +#define OBJ_crlTypes OBJ_pkcs9,23L + +#define LN_x509Crl "x509Crl" +#define NID_x509Crl 160 +#define OBJ_x509Crl OBJ_crlTypes,1L + +#define OBJ_pkcs12 OBJ_pkcs,12L + +#define OBJ_pkcs12_pbeids OBJ_pkcs12,1L + +#define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +#define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +#define NID_pbe_WithSHA1And128BitRC4 144 +#define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids,1L + +#define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +#define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +#define NID_pbe_WithSHA1And40BitRC4 145 +#define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids,2L + +#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids,3L + +#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids,4L + +#define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +#define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +#define NID_pbe_WithSHA1And128BitRC2_CBC 148 +#define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids,5L + +#define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +#define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +#define NID_pbe_WithSHA1And40BitRC2_CBC 149 +#define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids,6L + +#define OBJ_pkcs12_Version1 OBJ_pkcs12,10L + +#define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1,1L + +#define LN_keyBag "keyBag" +#define NID_keyBag 150 +#define OBJ_keyBag OBJ_pkcs12_BagIds,1L + +#define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +#define NID_pkcs8ShroudedKeyBag 151 +#define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds,2L + +#define LN_certBag "certBag" +#define NID_certBag 152 +#define OBJ_certBag OBJ_pkcs12_BagIds,3L + +#define LN_crlBag "crlBag" +#define NID_crlBag 153 +#define OBJ_crlBag OBJ_pkcs12_BagIds,4L + +#define LN_secretBag "secretBag" +#define NID_secretBag 154 +#define OBJ_secretBag OBJ_pkcs12_BagIds,5L + +#define LN_safeContentsBag "safeContentsBag" +#define NID_safeContentsBag 155 +#define OBJ_safeContentsBag OBJ_pkcs12_BagIds,6L + +#define SN_md2 "MD2" +#define LN_md2 "md2" +#define NID_md2 3 +#define OBJ_md2 OBJ_rsadsi,2L,2L + +#define SN_md4 "MD4" +#define LN_md4 "md4" +#define NID_md4 257 +#define OBJ_md4 OBJ_rsadsi,2L,4L + +#define SN_md5 "MD5" +#define LN_md5 "md5" +#define NID_md5 4 +#define OBJ_md5 OBJ_rsadsi,2L,5L + +#define SN_md5_sha1 "MD5-SHA1" +#define LN_md5_sha1 "md5-sha1" +#define NID_md5_sha1 114 + +#define LN_hmacWithSHA1 "hmacWithSHA1" +#define NID_hmacWithSHA1 163 +#define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +#define SN_rc2_cbc "RC2-CBC" +#define LN_rc2_cbc "rc2-cbc" +#define NID_rc2_cbc 37 +#define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +#define SN_rc2_ecb "RC2-ECB" +#define LN_rc2_ecb "rc2-ecb" +#define NID_rc2_ecb 38 + +#define SN_rc2_cfb64 "RC2-CFB" +#define LN_rc2_cfb64 "rc2-cfb" +#define NID_rc2_cfb64 39 + +#define SN_rc2_ofb64 "RC2-OFB" +#define LN_rc2_ofb64 "rc2-ofb" +#define NID_rc2_ofb64 40 + +#define SN_rc2_40_cbc "RC2-40-CBC" +#define LN_rc2_40_cbc "rc2-40-cbc" +#define NID_rc2_40_cbc 98 + +#define SN_rc2_64_cbc "RC2-64-CBC" +#define LN_rc2_64_cbc "rc2-64-cbc" +#define NID_rc2_64_cbc 166 + +#define SN_rc4 "RC4" +#define LN_rc4 "rc4" +#define NID_rc4 5 +#define OBJ_rc4 OBJ_rsadsi,3L,4L + +#define SN_rc4_40 "RC4-40" +#define LN_rc4_40 "rc4-40" +#define NID_rc4_40 97 + +#define SN_des_ede3_cbc "DES-EDE3-CBC" +#define LN_des_ede3_cbc "des-ede3-cbc" +#define NID_des_ede3_cbc 44 +#define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +#define SN_rc5_cbc "RC5-CBC" +#define LN_rc5_cbc "rc5-cbc" +#define NID_rc5_cbc 120 +#define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +#define SN_rc5_ecb "RC5-ECB" +#define LN_rc5_ecb "rc5-ecb" +#define NID_rc5_ecb 121 + +#define SN_rc5_cfb64 "RC5-CFB" +#define LN_rc5_cfb64 "rc5-cfb" +#define NID_rc5_cfb64 122 + +#define SN_rc5_ofb64 "RC5-OFB" +#define LN_rc5_ofb64 "rc5-ofb" +#define NID_rc5_ofb64 123 + +#define SN_ms_ext_req "msExtReq" +#define LN_ms_ext_req "Microsoft Extension Request" +#define NID_ms_ext_req 171 +#define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +#define SN_ms_code_ind "msCodeInd" +#define LN_ms_code_ind "Microsoft Individual Code Signing" +#define NID_ms_code_ind 134 +#define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +#define SN_ms_code_com "msCodeCom" +#define LN_ms_code_com "Microsoft Commercial Code Signing" +#define NID_ms_code_com 135 +#define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +#define SN_ms_ctl_sign "msCTLSign" +#define LN_ms_ctl_sign "Microsoft Trust List Signing" +#define NID_ms_ctl_sign 136 +#define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +#define SN_ms_sgc "msSGC" +#define LN_ms_sgc "Microsoft Server Gated Crypto" +#define NID_ms_sgc 137 +#define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +#define SN_ms_efs "msEFS" +#define LN_ms_efs "Microsoft Encrypted File System" +#define NID_ms_efs 138 +#define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +#define SN_ms_smartcard_login "msSmartcardLogin" +#define LN_ms_smartcard_login "Microsoft Smartcardlogin" +#define NID_ms_smartcard_login 648 +#define OBJ_ms_smartcard_login 1L,3L,6L,1L,4L,1L,311L,20L,2L,2L + +#define SN_ms_upn "msUPN" +#define LN_ms_upn "Microsoft Universal Principal Name" +#define NID_ms_upn 649 +#define OBJ_ms_upn 1L,3L,6L,1L,4L,1L,311L,20L,2L,3L + +#define SN_idea_cbc "IDEA-CBC" +#define LN_idea_cbc "idea-cbc" +#define NID_idea_cbc 34 +#define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +#define SN_idea_ecb "IDEA-ECB" +#define LN_idea_ecb "idea-ecb" +#define NID_idea_ecb 36 + +#define SN_idea_cfb64 "IDEA-CFB" +#define LN_idea_cfb64 "idea-cfb" +#define NID_idea_cfb64 35 + +#define SN_idea_ofb64 "IDEA-OFB" +#define LN_idea_ofb64 "idea-ofb" +#define NID_idea_ofb64 46 + +#define SN_bf_cbc "BF-CBC" +#define LN_bf_cbc "bf-cbc" +#define NID_bf_cbc 91 +#define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +#define SN_bf_ecb "BF-ECB" +#define LN_bf_ecb "bf-ecb" +#define NID_bf_ecb 92 + +#define SN_bf_cfb64 "BF-CFB" +#define LN_bf_cfb64 "bf-cfb" +#define NID_bf_cfb64 93 + +#define SN_bf_ofb64 "BF-OFB" +#define LN_bf_ofb64 "bf-ofb" +#define NID_bf_ofb64 94 + +#define SN_id_pkix "PKIX" +#define NID_id_pkix 127 +#define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +#define SN_id_pkix_mod "id-pkix-mod" +#define NID_id_pkix_mod 258 +#define OBJ_id_pkix_mod OBJ_id_pkix,0L + +#define SN_id_pe "id-pe" +#define NID_id_pe 175 +#define OBJ_id_pe OBJ_id_pkix,1L + +#define SN_id_qt "id-qt" +#define NID_id_qt 259 +#define OBJ_id_qt OBJ_id_pkix,2L + +#define SN_id_kp "id-kp" +#define NID_id_kp 128 +#define OBJ_id_kp OBJ_id_pkix,3L + +#define SN_id_it "id-it" +#define NID_id_it 260 +#define OBJ_id_it OBJ_id_pkix,4L + +#define SN_id_pkip "id-pkip" +#define NID_id_pkip 261 +#define OBJ_id_pkip OBJ_id_pkix,5L + +#define SN_id_alg "id-alg" +#define NID_id_alg 262 +#define OBJ_id_alg OBJ_id_pkix,6L + +#define SN_id_cmc "id-cmc" +#define NID_id_cmc 263 +#define OBJ_id_cmc OBJ_id_pkix,7L + +#define SN_id_on "id-on" +#define NID_id_on 264 +#define OBJ_id_on OBJ_id_pkix,8L + +#define SN_id_pda "id-pda" +#define NID_id_pda 265 +#define OBJ_id_pda OBJ_id_pkix,9L + +#define SN_id_aca "id-aca" +#define NID_id_aca 266 +#define OBJ_id_aca OBJ_id_pkix,10L + +#define SN_id_qcs "id-qcs" +#define NID_id_qcs 267 +#define OBJ_id_qcs OBJ_id_pkix,11L + +#define SN_id_cct "id-cct" +#define NID_id_cct 268 +#define OBJ_id_cct OBJ_id_pkix,12L + +#define SN_id_ppl "id-ppl" +#define NID_id_ppl 662 +#define OBJ_id_ppl OBJ_id_pkix,21L + +#define SN_id_ad "id-ad" +#define NID_id_ad 176 +#define OBJ_id_ad OBJ_id_pkix,48L + +#define SN_id_pkix1_explicit_88 "id-pkix1-explicit-88" +#define NID_id_pkix1_explicit_88 269 +#define OBJ_id_pkix1_explicit_88 OBJ_id_pkix_mod,1L + +#define SN_id_pkix1_implicit_88 "id-pkix1-implicit-88" +#define NID_id_pkix1_implicit_88 270 +#define OBJ_id_pkix1_implicit_88 OBJ_id_pkix_mod,2L + +#define SN_id_pkix1_explicit_93 "id-pkix1-explicit-93" +#define NID_id_pkix1_explicit_93 271 +#define OBJ_id_pkix1_explicit_93 OBJ_id_pkix_mod,3L + +#define SN_id_pkix1_implicit_93 "id-pkix1-implicit-93" +#define NID_id_pkix1_implicit_93 272 +#define OBJ_id_pkix1_implicit_93 OBJ_id_pkix_mod,4L + +#define SN_id_mod_crmf "id-mod-crmf" +#define NID_id_mod_crmf 273 +#define OBJ_id_mod_crmf OBJ_id_pkix_mod,5L + +#define SN_id_mod_cmc "id-mod-cmc" +#define NID_id_mod_cmc 274 +#define OBJ_id_mod_cmc OBJ_id_pkix_mod,6L + +#define SN_id_mod_kea_profile_88 "id-mod-kea-profile-88" +#define NID_id_mod_kea_profile_88 275 +#define OBJ_id_mod_kea_profile_88 OBJ_id_pkix_mod,7L + +#define SN_id_mod_kea_profile_93 "id-mod-kea-profile-93" +#define NID_id_mod_kea_profile_93 276 +#define OBJ_id_mod_kea_profile_93 OBJ_id_pkix_mod,8L + +#define SN_id_mod_cmp "id-mod-cmp" +#define NID_id_mod_cmp 277 +#define OBJ_id_mod_cmp OBJ_id_pkix_mod,9L + +#define SN_id_mod_qualified_cert_88 "id-mod-qualified-cert-88" +#define NID_id_mod_qualified_cert_88 278 +#define OBJ_id_mod_qualified_cert_88 OBJ_id_pkix_mod,10L + +#define SN_id_mod_qualified_cert_93 "id-mod-qualified-cert-93" +#define NID_id_mod_qualified_cert_93 279 +#define OBJ_id_mod_qualified_cert_93 OBJ_id_pkix_mod,11L + +#define SN_id_mod_attribute_cert "id-mod-attribute-cert" +#define NID_id_mod_attribute_cert 280 +#define OBJ_id_mod_attribute_cert OBJ_id_pkix_mod,12L + +#define SN_id_mod_timestamp_protocol "id-mod-timestamp-protocol" +#define NID_id_mod_timestamp_protocol 281 +#define OBJ_id_mod_timestamp_protocol OBJ_id_pkix_mod,13L + +#define SN_id_mod_ocsp "id-mod-ocsp" +#define NID_id_mod_ocsp 282 +#define OBJ_id_mod_ocsp OBJ_id_pkix_mod,14L + +#define SN_id_mod_dvcs "id-mod-dvcs" +#define NID_id_mod_dvcs 283 +#define OBJ_id_mod_dvcs OBJ_id_pkix_mod,15L + +#define SN_id_mod_cmp2000 "id-mod-cmp2000" +#define NID_id_mod_cmp2000 284 +#define OBJ_id_mod_cmp2000 OBJ_id_pkix_mod,16L + +#define SN_info_access "authorityInfoAccess" +#define LN_info_access "Authority Information Access" +#define NID_info_access 177 +#define OBJ_info_access OBJ_id_pe,1L + +#define SN_biometricInfo "biometricInfo" +#define LN_biometricInfo "Biometric Info" +#define NID_biometricInfo 285 +#define OBJ_biometricInfo OBJ_id_pe,2L + +#define SN_qcStatements "qcStatements" +#define NID_qcStatements 286 +#define OBJ_qcStatements OBJ_id_pe,3L + +#define SN_ac_auditEntity "ac-auditEntity" +#define NID_ac_auditEntity 287 +#define OBJ_ac_auditEntity OBJ_id_pe,4L + +#define SN_ac_targeting "ac-targeting" +#define NID_ac_targeting 288 +#define OBJ_ac_targeting OBJ_id_pe,5L + +#define SN_aaControls "aaControls" +#define NID_aaControls 289 +#define OBJ_aaControls OBJ_id_pe,6L + +#define SN_sbgp_ipAddrBlock "sbgp-ipAddrBlock" +#define NID_sbgp_ipAddrBlock 290 +#define OBJ_sbgp_ipAddrBlock OBJ_id_pe,7L + +#define SN_sbgp_autonomousSysNum "sbgp-autonomousSysNum" +#define NID_sbgp_autonomousSysNum 291 +#define OBJ_sbgp_autonomousSysNum OBJ_id_pe,8L + +#define SN_sbgp_routerIdentifier "sbgp-routerIdentifier" +#define NID_sbgp_routerIdentifier 292 +#define OBJ_sbgp_routerIdentifier OBJ_id_pe,9L + +#define SN_ac_proxying "ac-proxying" +#define NID_ac_proxying 397 +#define OBJ_ac_proxying OBJ_id_pe,10L + +#define SN_sinfo_access "subjectInfoAccess" +#define LN_sinfo_access "Subject Information Access" +#define NID_sinfo_access 398 +#define OBJ_sinfo_access OBJ_id_pe,11L + +#define SN_proxyCertInfo "proxyCertInfo" +#define LN_proxyCertInfo "Proxy Certificate Information" +#define NID_proxyCertInfo 663 +#define OBJ_proxyCertInfo OBJ_id_pe,14L + +#define SN_id_qt_cps "id-qt-cps" +#define LN_id_qt_cps "Policy Qualifier CPS" +#define NID_id_qt_cps 164 +#define OBJ_id_qt_cps OBJ_id_qt,1L + +#define SN_id_qt_unotice "id-qt-unotice" +#define LN_id_qt_unotice "Policy Qualifier User Notice" +#define NID_id_qt_unotice 165 +#define OBJ_id_qt_unotice OBJ_id_qt,2L + +#define SN_textNotice "textNotice" +#define NID_textNotice 293 +#define OBJ_textNotice OBJ_id_qt,3L + +#define SN_server_auth "serverAuth" +#define LN_server_auth "TLS Web Server Authentication" +#define NID_server_auth 129 +#define OBJ_server_auth OBJ_id_kp,1L + +#define SN_client_auth "clientAuth" +#define LN_client_auth "TLS Web Client Authentication" +#define NID_client_auth 130 +#define OBJ_client_auth OBJ_id_kp,2L + +#define SN_code_sign "codeSigning" +#define LN_code_sign "Code Signing" +#define NID_code_sign 131 +#define OBJ_code_sign OBJ_id_kp,3L + +#define SN_email_protect "emailProtection" +#define LN_email_protect "E-mail Protection" +#define NID_email_protect 132 +#define OBJ_email_protect OBJ_id_kp,4L + +#define SN_ipsecEndSystem "ipsecEndSystem" +#define LN_ipsecEndSystem "IPSec End System" +#define NID_ipsecEndSystem 294 +#define OBJ_ipsecEndSystem OBJ_id_kp,5L + +#define SN_ipsecTunnel "ipsecTunnel" +#define LN_ipsecTunnel "IPSec Tunnel" +#define NID_ipsecTunnel 295 +#define OBJ_ipsecTunnel OBJ_id_kp,6L + +#define SN_ipsecUser "ipsecUser" +#define LN_ipsecUser "IPSec User" +#define NID_ipsecUser 296 +#define OBJ_ipsecUser OBJ_id_kp,7L + +#define SN_time_stamp "timeStamping" +#define LN_time_stamp "Time Stamping" +#define NID_time_stamp 133 +#define OBJ_time_stamp OBJ_id_kp,8L + +#define SN_OCSP_sign "OCSPSigning" +#define LN_OCSP_sign "OCSP Signing" +#define NID_OCSP_sign 180 +#define OBJ_OCSP_sign OBJ_id_kp,9L + +#define SN_dvcs "DVCS" +#define LN_dvcs "dvcs" +#define NID_dvcs 297 +#define OBJ_dvcs OBJ_id_kp,10L + +#define SN_id_it_caProtEncCert "id-it-caProtEncCert" +#define NID_id_it_caProtEncCert 298 +#define OBJ_id_it_caProtEncCert OBJ_id_it,1L + +#define SN_id_it_signKeyPairTypes "id-it-signKeyPairTypes" +#define NID_id_it_signKeyPairTypes 299 +#define OBJ_id_it_signKeyPairTypes OBJ_id_it,2L + +#define SN_id_it_encKeyPairTypes "id-it-encKeyPairTypes" +#define NID_id_it_encKeyPairTypes 300 +#define OBJ_id_it_encKeyPairTypes OBJ_id_it,3L + +#define SN_id_it_preferredSymmAlg "id-it-preferredSymmAlg" +#define NID_id_it_preferredSymmAlg 301 +#define OBJ_id_it_preferredSymmAlg OBJ_id_it,4L + +#define SN_id_it_caKeyUpdateInfo "id-it-caKeyUpdateInfo" +#define NID_id_it_caKeyUpdateInfo 302 +#define OBJ_id_it_caKeyUpdateInfo OBJ_id_it,5L + +#define SN_id_it_currentCRL "id-it-currentCRL" +#define NID_id_it_currentCRL 303 +#define OBJ_id_it_currentCRL OBJ_id_it,6L + +#define SN_id_it_unsupportedOIDs "id-it-unsupportedOIDs" +#define NID_id_it_unsupportedOIDs 304 +#define OBJ_id_it_unsupportedOIDs OBJ_id_it,7L + +#define SN_id_it_subscriptionRequest "id-it-subscriptionRequest" +#define NID_id_it_subscriptionRequest 305 +#define OBJ_id_it_subscriptionRequest OBJ_id_it,8L + +#define SN_id_it_subscriptionResponse "id-it-subscriptionResponse" +#define NID_id_it_subscriptionResponse 306 +#define OBJ_id_it_subscriptionResponse OBJ_id_it,9L + +#define SN_id_it_keyPairParamReq "id-it-keyPairParamReq" +#define NID_id_it_keyPairParamReq 307 +#define OBJ_id_it_keyPairParamReq OBJ_id_it,10L + +#define SN_id_it_keyPairParamRep "id-it-keyPairParamRep" +#define NID_id_it_keyPairParamRep 308 +#define OBJ_id_it_keyPairParamRep OBJ_id_it,11L + +#define SN_id_it_revPassphrase "id-it-revPassphrase" +#define NID_id_it_revPassphrase 309 +#define OBJ_id_it_revPassphrase OBJ_id_it,12L + +#define SN_id_it_implicitConfirm "id-it-implicitConfirm" +#define NID_id_it_implicitConfirm 310 +#define OBJ_id_it_implicitConfirm OBJ_id_it,13L + +#define SN_id_it_confirmWaitTime "id-it-confirmWaitTime" +#define NID_id_it_confirmWaitTime 311 +#define OBJ_id_it_confirmWaitTime OBJ_id_it,14L + +#define SN_id_it_origPKIMessage "id-it-origPKIMessage" +#define NID_id_it_origPKIMessage 312 +#define OBJ_id_it_origPKIMessage OBJ_id_it,15L + +#define SN_id_regCtrl "id-regCtrl" +#define NID_id_regCtrl 313 +#define OBJ_id_regCtrl OBJ_id_pkip,1L + +#define SN_id_regInfo "id-regInfo" +#define NID_id_regInfo 314 +#define OBJ_id_regInfo OBJ_id_pkip,2L + +#define SN_id_regCtrl_regToken "id-regCtrl-regToken" +#define NID_id_regCtrl_regToken 315 +#define OBJ_id_regCtrl_regToken OBJ_id_regCtrl,1L + +#define SN_id_regCtrl_authenticator "id-regCtrl-authenticator" +#define NID_id_regCtrl_authenticator 316 +#define OBJ_id_regCtrl_authenticator OBJ_id_regCtrl,2L + +#define SN_id_regCtrl_pkiPublicationInfo "id-regCtrl-pkiPublicationInfo" +#define NID_id_regCtrl_pkiPublicationInfo 317 +#define OBJ_id_regCtrl_pkiPublicationInfo OBJ_id_regCtrl,3L + +#define SN_id_regCtrl_pkiArchiveOptions "id-regCtrl-pkiArchiveOptions" +#define NID_id_regCtrl_pkiArchiveOptions 318 +#define OBJ_id_regCtrl_pkiArchiveOptions OBJ_id_regCtrl,4L + +#define SN_id_regCtrl_oldCertID "id-regCtrl-oldCertID" +#define NID_id_regCtrl_oldCertID 319 +#define OBJ_id_regCtrl_oldCertID OBJ_id_regCtrl,5L + +#define SN_id_regCtrl_protocolEncrKey "id-regCtrl-protocolEncrKey" +#define NID_id_regCtrl_protocolEncrKey 320 +#define OBJ_id_regCtrl_protocolEncrKey OBJ_id_regCtrl,6L + +#define SN_id_regInfo_utf8Pairs "id-regInfo-utf8Pairs" +#define NID_id_regInfo_utf8Pairs 321 +#define OBJ_id_regInfo_utf8Pairs OBJ_id_regInfo,1L + +#define SN_id_regInfo_certReq "id-regInfo-certReq" +#define NID_id_regInfo_certReq 322 +#define OBJ_id_regInfo_certReq OBJ_id_regInfo,2L + +#define SN_id_alg_des40 "id-alg-des40" +#define NID_id_alg_des40 323 +#define OBJ_id_alg_des40 OBJ_id_alg,1L + +#define SN_id_alg_noSignature "id-alg-noSignature" +#define NID_id_alg_noSignature 324 +#define OBJ_id_alg_noSignature OBJ_id_alg,2L + +#define SN_id_alg_dh_sig_hmac_sha1 "id-alg-dh-sig-hmac-sha1" +#define NID_id_alg_dh_sig_hmac_sha1 325 +#define OBJ_id_alg_dh_sig_hmac_sha1 OBJ_id_alg,3L + +#define SN_id_alg_dh_pop "id-alg-dh-pop" +#define NID_id_alg_dh_pop 326 +#define OBJ_id_alg_dh_pop OBJ_id_alg,4L + +#define SN_id_cmc_statusInfo "id-cmc-statusInfo" +#define NID_id_cmc_statusInfo 327 +#define OBJ_id_cmc_statusInfo OBJ_id_cmc,1L + +#define SN_id_cmc_identification "id-cmc-identification" +#define NID_id_cmc_identification 328 +#define OBJ_id_cmc_identification OBJ_id_cmc,2L + +#define SN_id_cmc_identityProof "id-cmc-identityProof" +#define NID_id_cmc_identityProof 329 +#define OBJ_id_cmc_identityProof OBJ_id_cmc,3L + +#define SN_id_cmc_dataReturn "id-cmc-dataReturn" +#define NID_id_cmc_dataReturn 330 +#define OBJ_id_cmc_dataReturn OBJ_id_cmc,4L + +#define SN_id_cmc_transactionId "id-cmc-transactionId" +#define NID_id_cmc_transactionId 331 +#define OBJ_id_cmc_transactionId OBJ_id_cmc,5L + +#define SN_id_cmc_senderNonce "id-cmc-senderNonce" +#define NID_id_cmc_senderNonce 332 +#define OBJ_id_cmc_senderNonce OBJ_id_cmc,6L + +#define SN_id_cmc_recipientNonce "id-cmc-recipientNonce" +#define NID_id_cmc_recipientNonce 333 +#define OBJ_id_cmc_recipientNonce OBJ_id_cmc,7L + +#define SN_id_cmc_addExtensions "id-cmc-addExtensions" +#define NID_id_cmc_addExtensions 334 +#define OBJ_id_cmc_addExtensions OBJ_id_cmc,8L + +#define SN_id_cmc_encryptedPOP "id-cmc-encryptedPOP" +#define NID_id_cmc_encryptedPOP 335 +#define OBJ_id_cmc_encryptedPOP OBJ_id_cmc,9L + +#define SN_id_cmc_decryptedPOP "id-cmc-decryptedPOP" +#define NID_id_cmc_decryptedPOP 336 +#define OBJ_id_cmc_decryptedPOP OBJ_id_cmc,10L + +#define SN_id_cmc_lraPOPWitness "id-cmc-lraPOPWitness" +#define NID_id_cmc_lraPOPWitness 337 +#define OBJ_id_cmc_lraPOPWitness OBJ_id_cmc,11L + +#define SN_id_cmc_getCert "id-cmc-getCert" +#define NID_id_cmc_getCert 338 +#define OBJ_id_cmc_getCert OBJ_id_cmc,15L + +#define SN_id_cmc_getCRL "id-cmc-getCRL" +#define NID_id_cmc_getCRL 339 +#define OBJ_id_cmc_getCRL OBJ_id_cmc,16L + +#define SN_id_cmc_revokeRequest "id-cmc-revokeRequest" +#define NID_id_cmc_revokeRequest 340 +#define OBJ_id_cmc_revokeRequest OBJ_id_cmc,17L + +#define SN_id_cmc_regInfo "id-cmc-regInfo" +#define NID_id_cmc_regInfo 341 +#define OBJ_id_cmc_regInfo OBJ_id_cmc,18L + +#define SN_id_cmc_responseInfo "id-cmc-responseInfo" +#define NID_id_cmc_responseInfo 342 +#define OBJ_id_cmc_responseInfo OBJ_id_cmc,19L + +#define SN_id_cmc_queryPending "id-cmc-queryPending" +#define NID_id_cmc_queryPending 343 +#define OBJ_id_cmc_queryPending OBJ_id_cmc,21L + +#define SN_id_cmc_popLinkRandom "id-cmc-popLinkRandom" +#define NID_id_cmc_popLinkRandom 344 +#define OBJ_id_cmc_popLinkRandom OBJ_id_cmc,22L + +#define SN_id_cmc_popLinkWitness "id-cmc-popLinkWitness" +#define NID_id_cmc_popLinkWitness 345 +#define OBJ_id_cmc_popLinkWitness OBJ_id_cmc,23L + +#define SN_id_cmc_confirmCertAcceptance "id-cmc-confirmCertAcceptance" +#define NID_id_cmc_confirmCertAcceptance 346 +#define OBJ_id_cmc_confirmCertAcceptance OBJ_id_cmc,24L + +#define SN_id_on_personalData "id-on-personalData" +#define NID_id_on_personalData 347 +#define OBJ_id_on_personalData OBJ_id_on,1L + +#define SN_id_pda_dateOfBirth "id-pda-dateOfBirth" +#define NID_id_pda_dateOfBirth 348 +#define OBJ_id_pda_dateOfBirth OBJ_id_pda,1L + +#define SN_id_pda_placeOfBirth "id-pda-placeOfBirth" +#define NID_id_pda_placeOfBirth 349 +#define OBJ_id_pda_placeOfBirth OBJ_id_pda,2L + +#define SN_id_pda_gender "id-pda-gender" +#define NID_id_pda_gender 351 +#define OBJ_id_pda_gender OBJ_id_pda,3L + +#define SN_id_pda_countryOfCitizenship "id-pda-countryOfCitizenship" +#define NID_id_pda_countryOfCitizenship 352 +#define OBJ_id_pda_countryOfCitizenship OBJ_id_pda,4L + +#define SN_id_pda_countryOfResidence "id-pda-countryOfResidence" +#define NID_id_pda_countryOfResidence 353 +#define OBJ_id_pda_countryOfResidence OBJ_id_pda,5L + +#define SN_id_aca_authenticationInfo "id-aca-authenticationInfo" +#define NID_id_aca_authenticationInfo 354 +#define OBJ_id_aca_authenticationInfo OBJ_id_aca,1L + +#define SN_id_aca_accessIdentity "id-aca-accessIdentity" +#define NID_id_aca_accessIdentity 355 +#define OBJ_id_aca_accessIdentity OBJ_id_aca,2L + +#define SN_id_aca_chargingIdentity "id-aca-chargingIdentity" +#define NID_id_aca_chargingIdentity 356 +#define OBJ_id_aca_chargingIdentity OBJ_id_aca,3L + +#define SN_id_aca_group "id-aca-group" +#define NID_id_aca_group 357 +#define OBJ_id_aca_group OBJ_id_aca,4L + +#define SN_id_aca_role "id-aca-role" +#define NID_id_aca_role 358 +#define OBJ_id_aca_role OBJ_id_aca,5L + +#define SN_id_aca_encAttrs "id-aca-encAttrs" +#define NID_id_aca_encAttrs 399 +#define OBJ_id_aca_encAttrs OBJ_id_aca,6L + +#define SN_id_qcs_pkixQCSyntax_v1 "id-qcs-pkixQCSyntax-v1" +#define NID_id_qcs_pkixQCSyntax_v1 359 +#define OBJ_id_qcs_pkixQCSyntax_v1 OBJ_id_qcs,1L + +#define SN_id_cct_crs "id-cct-crs" +#define NID_id_cct_crs 360 +#define OBJ_id_cct_crs OBJ_id_cct,1L + +#define SN_id_cct_PKIData "id-cct-PKIData" +#define NID_id_cct_PKIData 361 +#define OBJ_id_cct_PKIData OBJ_id_cct,2L + +#define SN_id_cct_PKIResponse "id-cct-PKIResponse" +#define NID_id_cct_PKIResponse 362 +#define OBJ_id_cct_PKIResponse OBJ_id_cct,3L + +#define SN_id_ppl_anyLanguage "id-ppl-anyLanguage" +#define LN_id_ppl_anyLanguage "Any language" +#define NID_id_ppl_anyLanguage 664 +#define OBJ_id_ppl_anyLanguage OBJ_id_ppl,0L + +#define SN_id_ppl_inheritAll "id-ppl-inheritAll" +#define LN_id_ppl_inheritAll "Inherit all" +#define NID_id_ppl_inheritAll 665 +#define OBJ_id_ppl_inheritAll OBJ_id_ppl,1L + +#define SN_Independent "id-ppl-independent" +#define LN_Independent "Independent" +#define NID_Independent 667 +#define OBJ_Independent OBJ_id_ppl,2L + +#define SN_ad_OCSP "OCSP" +#define LN_ad_OCSP "OCSP" +#define NID_ad_OCSP 178 +#define OBJ_ad_OCSP OBJ_id_ad,1L + +#define SN_ad_ca_issuers "caIssuers" +#define LN_ad_ca_issuers "CA Issuers" +#define NID_ad_ca_issuers 179 +#define OBJ_ad_ca_issuers OBJ_id_ad,2L + +#define SN_ad_timeStamping "ad_timestamping" +#define LN_ad_timeStamping "AD Time Stamping" +#define NID_ad_timeStamping 363 +#define OBJ_ad_timeStamping OBJ_id_ad,3L + +#define SN_ad_dvcs "AD_DVCS" +#define LN_ad_dvcs "ad dvcs" +#define NID_ad_dvcs 364 +#define OBJ_ad_dvcs OBJ_id_ad,4L + +#define OBJ_id_pkix_OCSP OBJ_ad_OCSP + +#define SN_id_pkix_OCSP_basic "basicOCSPResponse" +#define LN_id_pkix_OCSP_basic "Basic OCSP Response" +#define NID_id_pkix_OCSP_basic 365 +#define OBJ_id_pkix_OCSP_basic OBJ_id_pkix_OCSP,1L + +#define SN_id_pkix_OCSP_Nonce "Nonce" +#define LN_id_pkix_OCSP_Nonce "OCSP Nonce" +#define NID_id_pkix_OCSP_Nonce 366 +#define OBJ_id_pkix_OCSP_Nonce OBJ_id_pkix_OCSP,2L + +#define SN_id_pkix_OCSP_CrlID "CrlID" +#define LN_id_pkix_OCSP_CrlID "OCSP CRL ID" +#define NID_id_pkix_OCSP_CrlID 367 +#define OBJ_id_pkix_OCSP_CrlID OBJ_id_pkix_OCSP,3L + +#define SN_id_pkix_OCSP_acceptableResponses "acceptableResponses" +#define LN_id_pkix_OCSP_acceptableResponses "Acceptable OCSP Responses" +#define NID_id_pkix_OCSP_acceptableResponses 368 +#define OBJ_id_pkix_OCSP_acceptableResponses OBJ_id_pkix_OCSP,4L + +#define SN_id_pkix_OCSP_noCheck "noCheck" +#define LN_id_pkix_OCSP_noCheck "OCSP No Check" +#define NID_id_pkix_OCSP_noCheck 369 +#define OBJ_id_pkix_OCSP_noCheck OBJ_id_pkix_OCSP,5L + +#define SN_id_pkix_OCSP_archiveCutoff "archiveCutoff" +#define LN_id_pkix_OCSP_archiveCutoff "OCSP Archive Cutoff" +#define NID_id_pkix_OCSP_archiveCutoff 370 +#define OBJ_id_pkix_OCSP_archiveCutoff OBJ_id_pkix_OCSP,6L + +#define SN_id_pkix_OCSP_serviceLocator "serviceLocator" +#define LN_id_pkix_OCSP_serviceLocator "OCSP Service Locator" +#define NID_id_pkix_OCSP_serviceLocator 371 +#define OBJ_id_pkix_OCSP_serviceLocator OBJ_id_pkix_OCSP,7L + +#define SN_id_pkix_OCSP_extendedStatus "extendedStatus" +#define LN_id_pkix_OCSP_extendedStatus "Extended OCSP Status" +#define NID_id_pkix_OCSP_extendedStatus 372 +#define OBJ_id_pkix_OCSP_extendedStatus OBJ_id_pkix_OCSP,8L + +#define SN_id_pkix_OCSP_valid "valid" +#define NID_id_pkix_OCSP_valid 373 +#define OBJ_id_pkix_OCSP_valid OBJ_id_pkix_OCSP,9L + +#define SN_id_pkix_OCSP_path "path" +#define NID_id_pkix_OCSP_path 374 +#define OBJ_id_pkix_OCSP_path OBJ_id_pkix_OCSP,10L + +#define SN_id_pkix_OCSP_trustRoot "trustRoot" +#define LN_id_pkix_OCSP_trustRoot "Trust Root" +#define NID_id_pkix_OCSP_trustRoot 375 +#define OBJ_id_pkix_OCSP_trustRoot OBJ_id_pkix_OCSP,11L + +#define SN_algorithm "algorithm" +#define LN_algorithm "algorithm" +#define NID_algorithm 376 +#define OBJ_algorithm 1L,3L,14L,3L,2L + +#define SN_md5WithRSA "RSA-NP-MD5" +#define LN_md5WithRSA "md5WithRSA" +#define NID_md5WithRSA 104 +#define OBJ_md5WithRSA OBJ_algorithm,3L + +#define SN_des_ecb "DES-ECB" +#define LN_des_ecb "des-ecb" +#define NID_des_ecb 29 +#define OBJ_des_ecb OBJ_algorithm,6L + +#define SN_des_cbc "DES-CBC" +#define LN_des_cbc "des-cbc" +#define NID_des_cbc 31 +#define OBJ_des_cbc OBJ_algorithm,7L + +#define SN_des_ofb64 "DES-OFB" +#define LN_des_ofb64 "des-ofb" +#define NID_des_ofb64 45 +#define OBJ_des_ofb64 OBJ_algorithm,8L + +#define SN_des_cfb64 "DES-CFB" +#define LN_des_cfb64 "des-cfb" +#define NID_des_cfb64 30 +#define OBJ_des_cfb64 OBJ_algorithm,9L + +#define SN_rsaSignature "rsaSignature" +#define NID_rsaSignature 377 +#define OBJ_rsaSignature OBJ_algorithm,11L + +#define SN_dsa_2 "DSA-old" +#define LN_dsa_2 "dsaEncryption-old" +#define NID_dsa_2 67 +#define OBJ_dsa_2 OBJ_algorithm,12L + +#define SN_dsaWithSHA "DSA-SHA" +#define LN_dsaWithSHA "dsaWithSHA" +#define NID_dsaWithSHA 66 +#define OBJ_dsaWithSHA OBJ_algorithm,13L + +#define SN_shaWithRSAEncryption "RSA-SHA" +#define LN_shaWithRSAEncryption "shaWithRSAEncryption" +#define NID_shaWithRSAEncryption 42 +#define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +#define SN_des_ede_ecb "DES-EDE" +#define LN_des_ede_ecb "des-ede" +#define NID_des_ede_ecb 32 +#define OBJ_des_ede_ecb OBJ_algorithm,17L + +#define SN_des_ede3_ecb "DES-EDE3" +#define LN_des_ede3_ecb "des-ede3" +#define NID_des_ede3_ecb 33 + +#define SN_des_ede_cbc "DES-EDE-CBC" +#define LN_des_ede_cbc "des-ede-cbc" +#define NID_des_ede_cbc 43 + +#define SN_des_ede_cfb64 "DES-EDE-CFB" +#define LN_des_ede_cfb64 "des-ede-cfb" +#define NID_des_ede_cfb64 60 + +#define SN_des_ede3_cfb64 "DES-EDE3-CFB" +#define LN_des_ede3_cfb64 "des-ede3-cfb" +#define NID_des_ede3_cfb64 61 + +#define SN_des_ede_ofb64 "DES-EDE-OFB" +#define LN_des_ede_ofb64 "des-ede-ofb" +#define NID_des_ede_ofb64 62 + +#define SN_des_ede3_ofb64 "DES-EDE3-OFB" +#define LN_des_ede3_ofb64 "des-ede3-ofb" +#define NID_des_ede3_ofb64 63 + +#define SN_desx_cbc "DESX-CBC" +#define LN_desx_cbc "desx-cbc" +#define NID_desx_cbc 80 + +#define SN_sha "SHA" +#define LN_sha "sha" +#define NID_sha 41 +#define OBJ_sha OBJ_algorithm,18L + +#define SN_sha1 "SHA1" +#define LN_sha1 "sha1" +#define NID_sha1 64 +#define OBJ_sha1 OBJ_algorithm,26L + +#define SN_dsaWithSHA1_2 "DSA-SHA1-old" +#define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +#define NID_dsaWithSHA1_2 70 +#define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +#define SN_sha1WithRSA "RSA-SHA1-2" +#define LN_sha1WithRSA "sha1WithRSA" +#define NID_sha1WithRSA 115 +#define OBJ_sha1WithRSA OBJ_algorithm,29L + +#define SN_ripemd160 "RIPEMD160" +#define LN_ripemd160 "ripemd160" +#define NID_ripemd160 117 +#define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +#define SN_ripemd160WithRSA "RSA-RIPEMD160" +#define LN_ripemd160WithRSA "ripemd160WithRSA" +#define NID_ripemd160WithRSA 119 +#define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +#define SN_sxnet "SXNetID" +#define LN_sxnet "Strong Extranet ID" +#define NID_sxnet 143 +#define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +#define SN_X500 "X500" +#define LN_X500 "directory services (X.500)" +#define NID_X500 11 +#define OBJ_X500 2L,5L + +#define SN_X509 "X509" +#define NID_X509 12 +#define OBJ_X509 OBJ_X500,4L + +#define SN_commonName "CN" +#define LN_commonName "commonName" +#define NID_commonName 13 +#define OBJ_commonName OBJ_X509,3L + +#define SN_surname "SN" +#define LN_surname "surname" +#define NID_surname 100 +#define OBJ_surname OBJ_X509,4L + +#define LN_serialNumber "serialNumber" +#define NID_serialNumber 105 +#define OBJ_serialNumber OBJ_X509,5L + +#define SN_countryName "C" +#define LN_countryName "countryName" +#define NID_countryName 14 +#define OBJ_countryName OBJ_X509,6L + +#define SN_localityName "L" +#define LN_localityName "localityName" +#define NID_localityName 15 +#define OBJ_localityName OBJ_X509,7L + +#define SN_stateOrProvinceName "ST" +#define LN_stateOrProvinceName "stateOrProvinceName" +#define NID_stateOrProvinceName 16 +#define OBJ_stateOrProvinceName OBJ_X509,8L + +#define LN_streetAddress "streetAddress" +#define NID_streetAddress 660 +#define OBJ_streetAddress OBJ_X509,9L + +#define SN_organizationName "O" +#define LN_organizationName "organizationName" +#define NID_organizationName 17 +#define OBJ_organizationName OBJ_X509,10L + +#define SN_organizationalUnitName "OU" +#define LN_organizationalUnitName "organizationalUnitName" +#define NID_organizationalUnitName 18 +#define OBJ_organizationalUnitName OBJ_X509,11L + +#define LN_title "title" +#define NID_title 106 +#define OBJ_title OBJ_X509,12L + +#define LN_description "description" +#define NID_description 107 +#define OBJ_description OBJ_X509,13L + +#define LN_postalCode "postalCode" +#define NID_postalCode 661 +#define OBJ_postalCode OBJ_X509,17L + +#define SN_name "name" +#define LN_name "name" +#define NID_name 173 +#define OBJ_name OBJ_X509,41L + +#define SN_givenName "GN" +#define LN_givenName "givenName" +#define NID_givenName 99 +#define OBJ_givenName OBJ_X509,42L + +#define LN_initials "initials" +#define NID_initials 101 +#define OBJ_initials OBJ_X509,43L + +#define LN_generationQualifier "generationQualifier" +#define NID_generationQualifier 509 +#define OBJ_generationQualifier OBJ_X509,44L + +#define LN_x500UniqueIdentifier "x500UniqueIdentifier" +#define NID_x500UniqueIdentifier 503 +#define OBJ_x500UniqueIdentifier OBJ_X509,45L + +#define SN_dnQualifier "dnQualifier" +#define LN_dnQualifier "dnQualifier" +#define NID_dnQualifier 174 +#define OBJ_dnQualifier OBJ_X509,46L + +#define LN_pseudonym "pseudonym" +#define NID_pseudonym 510 +#define OBJ_pseudonym OBJ_X509,65L + +#define SN_role "role" +#define LN_role "role" +#define NID_role 400 +#define OBJ_role OBJ_X509,72L + +#define SN_X500algorithms "X500algorithms" +#define LN_X500algorithms "directory services - algorithms" +#define NID_X500algorithms 378 +#define OBJ_X500algorithms OBJ_X500,8L + +#define SN_rsa "RSA" +#define LN_rsa "rsa" +#define NID_rsa 19 +#define OBJ_rsa OBJ_X500algorithms,1L,1L + +#define SN_mdc2WithRSA "RSA-MDC2" +#define LN_mdc2WithRSA "mdc2WithRSA" +#define NID_mdc2WithRSA 96 +#define OBJ_mdc2WithRSA OBJ_X500algorithms,3L,100L + +#define SN_mdc2 "MDC2" +#define LN_mdc2 "mdc2" +#define NID_mdc2 95 +#define OBJ_mdc2 OBJ_X500algorithms,3L,101L + +#define SN_id_ce "id-ce" +#define NID_id_ce 81 +#define OBJ_id_ce OBJ_X500,29L + +#define SN_subject_directory_attributes "subjectDirectoryAttributes" +#define LN_subject_directory_attributes "X509v3 Subject Directory Attributes" +#define NID_subject_directory_attributes 769 +#define OBJ_subject_directory_attributes OBJ_id_ce,9L + +#define SN_subject_key_identifier "subjectKeyIdentifier" +#define LN_subject_key_identifier "X509v3 Subject Key Identifier" +#define NID_subject_key_identifier 82 +#define OBJ_subject_key_identifier OBJ_id_ce,14L + +#define SN_key_usage "keyUsage" +#define LN_key_usage "X509v3 Key Usage" +#define NID_key_usage 83 +#define OBJ_key_usage OBJ_id_ce,15L + +#define SN_private_key_usage_period "privateKeyUsagePeriod" +#define LN_private_key_usage_period "X509v3 Private Key Usage Period" +#define NID_private_key_usage_period 84 +#define OBJ_private_key_usage_period OBJ_id_ce,16L + +#define SN_subject_alt_name "subjectAltName" +#define LN_subject_alt_name "X509v3 Subject Alternative Name" +#define NID_subject_alt_name 85 +#define OBJ_subject_alt_name OBJ_id_ce,17L + +#define SN_issuer_alt_name "issuerAltName" +#define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +#define NID_issuer_alt_name 86 +#define OBJ_issuer_alt_name OBJ_id_ce,18L + +#define SN_basic_constraints "basicConstraints" +#define LN_basic_constraints "X509v3 Basic Constraints" +#define NID_basic_constraints 87 +#define OBJ_basic_constraints OBJ_id_ce,19L + +#define SN_crl_number "crlNumber" +#define LN_crl_number "X509v3 CRL Number" +#define NID_crl_number 88 +#define OBJ_crl_number OBJ_id_ce,20L + +#define SN_crl_reason "CRLReason" +#define LN_crl_reason "X509v3 CRL Reason Code" +#define NID_crl_reason 141 +#define OBJ_crl_reason OBJ_id_ce,21L + +#define SN_invalidity_date "invalidityDate" +#define LN_invalidity_date "Invalidity Date" +#define NID_invalidity_date 142 +#define OBJ_invalidity_date OBJ_id_ce,24L + +#define SN_delta_crl "deltaCRL" +#define LN_delta_crl "X509v3 Delta CRL Indicator" +#define NID_delta_crl 140 +#define OBJ_delta_crl OBJ_id_ce,27L + +#define SN_issuing_distribution_point "issuingDistributionPoint" +#define LN_issuing_distribution_point "X509v3 Issuing Distrubution Point" +#define NID_issuing_distribution_point 770 +#define OBJ_issuing_distribution_point OBJ_id_ce,28L + +#define SN_certificate_issuer "certificateIssuer" +#define LN_certificate_issuer "X509v3 Certificate Issuer" +#define NID_certificate_issuer 771 +#define OBJ_certificate_issuer OBJ_id_ce,29L + +#define SN_name_constraints "nameConstraints" +#define LN_name_constraints "X509v3 Name Constraints" +#define NID_name_constraints 666 +#define OBJ_name_constraints OBJ_id_ce,30L + +#define SN_crl_distribution_points "crlDistributionPoints" +#define LN_crl_distribution_points "X509v3 CRL Distribution Points" +#define NID_crl_distribution_points 103 +#define OBJ_crl_distribution_points OBJ_id_ce,31L + +#define SN_certificate_policies "certificatePolicies" +#define LN_certificate_policies "X509v3 Certificate Policies" +#define NID_certificate_policies 89 +#define OBJ_certificate_policies OBJ_id_ce,32L + +#define SN_any_policy "anyPolicy" +#define LN_any_policy "X509v3 Any Policy" +#define NID_any_policy 746 +#define OBJ_any_policy OBJ_certificate_policies,0L + +#define SN_policy_mappings "policyMappings" +#define LN_policy_mappings "X509v3 Policy Mappings" +#define NID_policy_mappings 747 +#define OBJ_policy_mappings OBJ_id_ce,33L + +#define SN_authority_key_identifier "authorityKeyIdentifier" +#define LN_authority_key_identifier "X509v3 Authority Key Identifier" +#define NID_authority_key_identifier 90 +#define OBJ_authority_key_identifier OBJ_id_ce,35L + +#define SN_policy_constraints "policyConstraints" +#define LN_policy_constraints "X509v3 Policy Constraints" +#define NID_policy_constraints 401 +#define OBJ_policy_constraints OBJ_id_ce,36L + +#define SN_ext_key_usage "extendedKeyUsage" +#define LN_ext_key_usage "X509v3 Extended Key Usage" +#define NID_ext_key_usage 126 +#define OBJ_ext_key_usage OBJ_id_ce,37L + +#define SN_inhibit_any_policy "inhibitAnyPolicy" +#define LN_inhibit_any_policy "X509v3 Inhibit Any Policy" +#define NID_inhibit_any_policy 748 +#define OBJ_inhibit_any_policy OBJ_id_ce,54L + +#define SN_target_information "targetInformation" +#define LN_target_information "X509v3 AC Targeting" +#define NID_target_information 402 +#define OBJ_target_information OBJ_id_ce,55L + +#define SN_no_rev_avail "noRevAvail" +#define LN_no_rev_avail "X509v3 No Revocation Available" +#define NID_no_rev_avail 403 +#define OBJ_no_rev_avail OBJ_id_ce,56L + +#define SN_netscape "Netscape" +#define LN_netscape "Netscape Communications Corp." +#define NID_netscape 57 +#define OBJ_netscape 2L,16L,840L,1L,113730L + +#define SN_netscape_cert_extension "nsCertExt" +#define LN_netscape_cert_extension "Netscape Certificate Extension" +#define NID_netscape_cert_extension 58 +#define OBJ_netscape_cert_extension OBJ_netscape,1L + +#define SN_netscape_data_type "nsDataType" +#define LN_netscape_data_type "Netscape Data Type" +#define NID_netscape_data_type 59 +#define OBJ_netscape_data_type OBJ_netscape,2L + +#define SN_netscape_cert_type "nsCertType" +#define LN_netscape_cert_type "Netscape Cert Type" +#define NID_netscape_cert_type 71 +#define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +#define SN_netscape_base_url "nsBaseUrl" +#define LN_netscape_base_url "Netscape Base Url" +#define NID_netscape_base_url 72 +#define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +#define SN_netscape_revocation_url "nsRevocationUrl" +#define LN_netscape_revocation_url "Netscape Revocation Url" +#define NID_netscape_revocation_url 73 +#define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +#define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +#define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +#define NID_netscape_ca_revocation_url 74 +#define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +#define SN_netscape_renewal_url "nsRenewalUrl" +#define LN_netscape_renewal_url "Netscape Renewal Url" +#define NID_netscape_renewal_url 75 +#define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +#define SN_netscape_ca_policy_url "nsCaPolicyUrl" +#define LN_netscape_ca_policy_url "Netscape CA Policy Url" +#define NID_netscape_ca_policy_url 76 +#define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +#define SN_netscape_ssl_server_name "nsSslServerName" +#define LN_netscape_ssl_server_name "Netscape SSL Server Name" +#define NID_netscape_ssl_server_name 77 +#define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +#define SN_netscape_comment "nsComment" +#define LN_netscape_comment "Netscape Comment" +#define NID_netscape_comment 78 +#define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +#define SN_netscape_cert_sequence "nsCertSequence" +#define LN_netscape_cert_sequence "Netscape Certificate Sequence" +#define NID_netscape_cert_sequence 79 +#define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +#define SN_ns_sgc "nsSGC" +#define LN_ns_sgc "Netscape Server Gated Crypto" +#define NID_ns_sgc 139 +#define OBJ_ns_sgc OBJ_netscape,4L,1L + +#define SN_org "ORG" +#define LN_org "org" +#define NID_org 379 +#define OBJ_org OBJ_iso,3L + +#define SN_dod "DOD" +#define LN_dod "dod" +#define NID_dod 380 +#define OBJ_dod OBJ_org,6L + +#define SN_iana "IANA" +#define LN_iana "iana" +#define NID_iana 381 +#define OBJ_iana OBJ_dod,1L + +#define OBJ_internet OBJ_iana + +#define SN_Directory "directory" +#define LN_Directory "Directory" +#define NID_Directory 382 +#define OBJ_Directory OBJ_internet,1L + +#define SN_Management "mgmt" +#define LN_Management "Management" +#define NID_Management 383 +#define OBJ_Management OBJ_internet,2L + +#define SN_Experimental "experimental" +#define LN_Experimental "Experimental" +#define NID_Experimental 384 +#define OBJ_Experimental OBJ_internet,3L + +#define SN_Private "private" +#define LN_Private "Private" +#define NID_Private 385 +#define OBJ_Private OBJ_internet,4L + +#define SN_Security "security" +#define LN_Security "Security" +#define NID_Security 386 +#define OBJ_Security OBJ_internet,5L + +#define SN_SNMPv2 "snmpv2" +#define LN_SNMPv2 "SNMPv2" +#define NID_SNMPv2 387 +#define OBJ_SNMPv2 OBJ_internet,6L + +#define LN_Mail "Mail" +#define NID_Mail 388 +#define OBJ_Mail OBJ_internet,7L + +#define SN_Enterprises "enterprises" +#define LN_Enterprises "Enterprises" +#define NID_Enterprises 389 +#define OBJ_Enterprises OBJ_Private,1L + +#define SN_dcObject "dcobject" +#define LN_dcObject "dcObject" +#define NID_dcObject 390 +#define OBJ_dcObject OBJ_Enterprises,1466L,344L + +#define SN_mime_mhs "mime-mhs" +#define LN_mime_mhs "MIME MHS" +#define NID_mime_mhs 504 +#define OBJ_mime_mhs OBJ_Mail,1L + +#define SN_mime_mhs_headings "mime-mhs-headings" +#define LN_mime_mhs_headings "mime-mhs-headings" +#define NID_mime_mhs_headings 505 +#define OBJ_mime_mhs_headings OBJ_mime_mhs,1L + +#define SN_mime_mhs_bodies "mime-mhs-bodies" +#define LN_mime_mhs_bodies "mime-mhs-bodies" +#define NID_mime_mhs_bodies 506 +#define OBJ_mime_mhs_bodies OBJ_mime_mhs,2L + +#define SN_id_hex_partial_message "id-hex-partial-message" +#define LN_id_hex_partial_message "id-hex-partial-message" +#define NID_id_hex_partial_message 507 +#define OBJ_id_hex_partial_message OBJ_mime_mhs_headings,1L + +#define SN_id_hex_multipart_message "id-hex-multipart-message" +#define LN_id_hex_multipart_message "id-hex-multipart-message" +#define NID_id_hex_multipart_message 508 +#define OBJ_id_hex_multipart_message OBJ_mime_mhs_headings,2L + +#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 + +#define OBJ_csor 2L,16L,840L,1L,101L,3L + +#define OBJ_nistAlgorithms OBJ_csor,4L + +#define OBJ_aes OBJ_nistAlgorithms,1L + +#define SN_aes_128_ecb "AES-128-ECB" +#define LN_aes_128_ecb "aes-128-ecb" +#define NID_aes_128_ecb 418 +#define OBJ_aes_128_ecb OBJ_aes,1L + +#define SN_aes_128_cbc "AES-128-CBC" +#define LN_aes_128_cbc "aes-128-cbc" +#define NID_aes_128_cbc 419 +#define OBJ_aes_128_cbc OBJ_aes,2L + +#define SN_aes_128_ofb128 "AES-128-OFB" +#define LN_aes_128_ofb128 "aes-128-ofb" +#define NID_aes_128_ofb128 420 +#define OBJ_aes_128_ofb128 OBJ_aes,3L + +#define SN_aes_128_cfb128 "AES-128-CFB" +#define LN_aes_128_cfb128 "aes-128-cfb" +#define NID_aes_128_cfb128 421 +#define OBJ_aes_128_cfb128 OBJ_aes,4L + +#define SN_aes_192_ecb "AES-192-ECB" +#define LN_aes_192_ecb "aes-192-ecb" +#define NID_aes_192_ecb 422 +#define OBJ_aes_192_ecb OBJ_aes,21L + +#define SN_aes_192_cbc "AES-192-CBC" +#define LN_aes_192_cbc "aes-192-cbc" +#define NID_aes_192_cbc 423 +#define OBJ_aes_192_cbc OBJ_aes,22L + +#define SN_aes_192_ofb128 "AES-192-OFB" +#define LN_aes_192_ofb128 "aes-192-ofb" +#define NID_aes_192_ofb128 424 +#define OBJ_aes_192_ofb128 OBJ_aes,23L + +#define SN_aes_192_cfb128 "AES-192-CFB" +#define LN_aes_192_cfb128 "aes-192-cfb" +#define NID_aes_192_cfb128 425 +#define OBJ_aes_192_cfb128 OBJ_aes,24L + +#define SN_aes_256_ecb "AES-256-ECB" +#define LN_aes_256_ecb "aes-256-ecb" +#define NID_aes_256_ecb 426 +#define OBJ_aes_256_ecb OBJ_aes,41L + +#define SN_aes_256_cbc "AES-256-CBC" +#define LN_aes_256_cbc "aes-256-cbc" +#define NID_aes_256_cbc 427 +#define OBJ_aes_256_cbc OBJ_aes,42L + +#define SN_aes_256_ofb128 "AES-256-OFB" +#define LN_aes_256_ofb128 "aes-256-ofb" +#define NID_aes_256_ofb128 428 +#define OBJ_aes_256_ofb128 OBJ_aes,43L + +#define SN_aes_256_cfb128 "AES-256-CFB" +#define LN_aes_256_cfb128 "aes-256-cfb" +#define NID_aes_256_cfb128 429 +#define OBJ_aes_256_cfb128 OBJ_aes,44L + +#define SN_aes_128_cfb1 "AES-128-CFB1" +#define LN_aes_128_cfb1 "aes-128-cfb1" +#define NID_aes_128_cfb1 650 + +#define SN_aes_192_cfb1 "AES-192-CFB1" +#define LN_aes_192_cfb1 "aes-192-cfb1" +#define NID_aes_192_cfb1 651 + +#define SN_aes_256_cfb1 "AES-256-CFB1" +#define LN_aes_256_cfb1 "aes-256-cfb1" +#define NID_aes_256_cfb1 652 + +#define SN_aes_128_cfb8 "AES-128-CFB8" +#define LN_aes_128_cfb8 "aes-128-cfb8" +#define NID_aes_128_cfb8 653 + +#define SN_aes_192_cfb8 "AES-192-CFB8" +#define LN_aes_192_cfb8 "aes-192-cfb8" +#define NID_aes_192_cfb8 654 + +#define SN_aes_256_cfb8 "AES-256-CFB8" +#define LN_aes_256_cfb8 "aes-256-cfb8" +#define NID_aes_256_cfb8 655 + +#define SN_des_cfb1 "DES-CFB1" +#define LN_des_cfb1 "des-cfb1" +#define NID_des_cfb1 656 + +#define SN_des_cfb8 "DES-CFB8" +#define LN_des_cfb8 "des-cfb8" +#define NID_des_cfb8 657 + +#define SN_des_ede3_cfb1 "DES-EDE3-CFB1" +#define LN_des_ede3_cfb1 "des-ede3-cfb1" +#define NID_des_ede3_cfb1 658 + +#define SN_des_ede3_cfb8 "DES-EDE3-CFB8" +#define LN_des_ede3_cfb8 "des-ede3-cfb8" +#define NID_des_ede3_cfb8 659 + +#define OBJ_nist_hashalgs OBJ_nistAlgorithms,2L + +#define SN_sha256 "SHA256" +#define LN_sha256 "sha256" +#define NID_sha256 672 +#define OBJ_sha256 OBJ_nist_hashalgs,1L + +#define SN_sha384 "SHA384" +#define LN_sha384 "sha384" +#define NID_sha384 673 +#define OBJ_sha384 OBJ_nist_hashalgs,2L + +#define SN_sha512 "SHA512" +#define LN_sha512 "sha512" +#define NID_sha512 674 +#define OBJ_sha512 OBJ_nist_hashalgs,3L + +#define SN_sha224 "SHA224" +#define LN_sha224 "sha224" +#define NID_sha224 675 +#define OBJ_sha224 OBJ_nist_hashalgs,4L + +#define SN_hold_instruction_code "holdInstructionCode" +#define LN_hold_instruction_code "Hold Instruction Code" +#define NID_hold_instruction_code 430 +#define OBJ_hold_instruction_code OBJ_id_ce,23L + +#define OBJ_holdInstruction OBJ_X9_57,2L + +#define SN_hold_instruction_none "holdInstructionNone" +#define LN_hold_instruction_none "Hold Instruction None" +#define NID_hold_instruction_none 431 +#define OBJ_hold_instruction_none OBJ_holdInstruction,1L + +#define SN_hold_instruction_call_issuer "holdInstructionCallIssuer" +#define LN_hold_instruction_call_issuer "Hold Instruction Call Issuer" +#define NID_hold_instruction_call_issuer 432 +#define OBJ_hold_instruction_call_issuer OBJ_holdInstruction,2L + +#define SN_hold_instruction_reject "holdInstructionReject" +#define LN_hold_instruction_reject "Hold Instruction Reject" +#define NID_hold_instruction_reject 433 +#define OBJ_hold_instruction_reject OBJ_holdInstruction,3L + +#define SN_data "data" +#define NID_data 434 +#define OBJ_data OBJ_itu_t,9L + +#define SN_pss "pss" +#define NID_pss 435 +#define OBJ_pss OBJ_data,2342L + +#define SN_ucl "ucl" +#define NID_ucl 436 +#define OBJ_ucl OBJ_pss,19200300L + +#define SN_pilot "pilot" +#define NID_pilot 437 +#define OBJ_pilot OBJ_ucl,100L + +#define LN_pilotAttributeType "pilotAttributeType" +#define NID_pilotAttributeType 438 +#define OBJ_pilotAttributeType OBJ_pilot,1L + +#define LN_pilotAttributeSyntax "pilotAttributeSyntax" +#define NID_pilotAttributeSyntax 439 +#define OBJ_pilotAttributeSyntax OBJ_pilot,3L + +#define LN_pilotObjectClass "pilotObjectClass" +#define NID_pilotObjectClass 440 +#define OBJ_pilotObjectClass OBJ_pilot,4L + +#define LN_pilotGroups "pilotGroups" +#define NID_pilotGroups 441 +#define OBJ_pilotGroups OBJ_pilot,10L + +#define LN_iA5StringSyntax "iA5StringSyntax" +#define NID_iA5StringSyntax 442 +#define OBJ_iA5StringSyntax OBJ_pilotAttributeSyntax,4L + +#define LN_caseIgnoreIA5StringSyntax "caseIgnoreIA5StringSyntax" +#define NID_caseIgnoreIA5StringSyntax 443 +#define OBJ_caseIgnoreIA5StringSyntax OBJ_pilotAttributeSyntax,5L + +#define LN_pilotObject "pilotObject" +#define NID_pilotObject 444 +#define OBJ_pilotObject OBJ_pilotObjectClass,3L + +#define LN_pilotPerson "pilotPerson" +#define NID_pilotPerson 445 +#define OBJ_pilotPerson OBJ_pilotObjectClass,4L + +#define SN_account "account" +#define NID_account 446 +#define OBJ_account OBJ_pilotObjectClass,5L + +#define SN_document "document" +#define NID_document 447 +#define OBJ_document OBJ_pilotObjectClass,6L + +#define SN_room "room" +#define NID_room 448 +#define OBJ_room OBJ_pilotObjectClass,7L + +#define LN_documentSeries "documentSeries" +#define NID_documentSeries 449 +#define OBJ_documentSeries OBJ_pilotObjectClass,9L + +#define SN_Domain "domain" +#define LN_Domain "Domain" +#define NID_Domain 392 +#define OBJ_Domain OBJ_pilotObjectClass,13L + +#define LN_rFC822localPart "rFC822localPart" +#define NID_rFC822localPart 450 +#define OBJ_rFC822localPart OBJ_pilotObjectClass,14L + +#define LN_dNSDomain "dNSDomain" +#define NID_dNSDomain 451 +#define OBJ_dNSDomain OBJ_pilotObjectClass,15L + +#define LN_domainRelatedObject "domainRelatedObject" +#define NID_domainRelatedObject 452 +#define OBJ_domainRelatedObject OBJ_pilotObjectClass,17L + +#define LN_friendlyCountry "friendlyCountry" +#define NID_friendlyCountry 453 +#define OBJ_friendlyCountry OBJ_pilotObjectClass,18L + +#define LN_simpleSecurityObject "simpleSecurityObject" +#define NID_simpleSecurityObject 454 +#define OBJ_simpleSecurityObject OBJ_pilotObjectClass,19L + +#define LN_pilotOrganization "pilotOrganization" +#define NID_pilotOrganization 455 +#define OBJ_pilotOrganization OBJ_pilotObjectClass,20L + +#define LN_pilotDSA "pilotDSA" +#define NID_pilotDSA 456 +#define OBJ_pilotDSA OBJ_pilotObjectClass,21L + +#define LN_qualityLabelledData "qualityLabelledData" +#define NID_qualityLabelledData 457 +#define OBJ_qualityLabelledData OBJ_pilotObjectClass,22L + +#define SN_userId "UID" +#define LN_userId "userId" +#define NID_userId 458 +#define OBJ_userId OBJ_pilotAttributeType,1L + +#define LN_textEncodedORAddress "textEncodedORAddress" +#define NID_textEncodedORAddress 459 +#define OBJ_textEncodedORAddress OBJ_pilotAttributeType,2L + +#define SN_rfc822Mailbox "mail" +#define LN_rfc822Mailbox "rfc822Mailbox" +#define NID_rfc822Mailbox 460 +#define OBJ_rfc822Mailbox OBJ_pilotAttributeType,3L + +#define SN_info "info" +#define NID_info 461 +#define OBJ_info OBJ_pilotAttributeType,4L + +#define LN_favouriteDrink "favouriteDrink" +#define NID_favouriteDrink 462 +#define OBJ_favouriteDrink OBJ_pilotAttributeType,5L + +#define LN_roomNumber "roomNumber" +#define NID_roomNumber 463 +#define OBJ_roomNumber OBJ_pilotAttributeType,6L + +#define SN_photo "photo" +#define NID_photo 464 +#define OBJ_photo OBJ_pilotAttributeType,7L + +#define LN_userClass "userClass" +#define NID_userClass 465 +#define OBJ_userClass OBJ_pilotAttributeType,8L + +#define SN_host "host" +#define NID_host 466 +#define OBJ_host OBJ_pilotAttributeType,9L + +#define SN_manager "manager" +#define NID_manager 467 +#define OBJ_manager OBJ_pilotAttributeType,10L + +#define LN_documentIdentifier "documentIdentifier" +#define NID_documentIdentifier 468 +#define OBJ_documentIdentifier OBJ_pilotAttributeType,11L + +#define LN_documentTitle "documentTitle" +#define NID_documentTitle 469 +#define OBJ_documentTitle OBJ_pilotAttributeType,12L + +#define LN_documentVersion "documentVersion" +#define NID_documentVersion 470 +#define OBJ_documentVersion OBJ_pilotAttributeType,13L + +#define LN_documentAuthor "documentAuthor" +#define NID_documentAuthor 471 +#define OBJ_documentAuthor OBJ_pilotAttributeType,14L + +#define LN_documentLocation "documentLocation" +#define NID_documentLocation 472 +#define OBJ_documentLocation OBJ_pilotAttributeType,15L + +#define LN_homeTelephoneNumber "homeTelephoneNumber" +#define NID_homeTelephoneNumber 473 +#define OBJ_homeTelephoneNumber OBJ_pilotAttributeType,20L + +#define SN_secretary "secretary" +#define NID_secretary 474 +#define OBJ_secretary OBJ_pilotAttributeType,21L + +#define LN_otherMailbox "otherMailbox" +#define NID_otherMailbox 475 +#define OBJ_otherMailbox OBJ_pilotAttributeType,22L + +#define LN_lastModifiedTime "lastModifiedTime" +#define NID_lastModifiedTime 476 +#define OBJ_lastModifiedTime OBJ_pilotAttributeType,23L + +#define LN_lastModifiedBy "lastModifiedBy" +#define NID_lastModifiedBy 477 +#define OBJ_lastModifiedBy OBJ_pilotAttributeType,24L + +#define SN_domainComponent "DC" +#define LN_domainComponent "domainComponent" +#define NID_domainComponent 391 +#define OBJ_domainComponent OBJ_pilotAttributeType,25L + +#define LN_aRecord "aRecord" +#define NID_aRecord 478 +#define OBJ_aRecord OBJ_pilotAttributeType,26L + +#define LN_pilotAttributeType27 "pilotAttributeType27" +#define NID_pilotAttributeType27 479 +#define OBJ_pilotAttributeType27 OBJ_pilotAttributeType,27L + +#define LN_mXRecord "mXRecord" +#define NID_mXRecord 480 +#define OBJ_mXRecord OBJ_pilotAttributeType,28L + +#define LN_nSRecord "nSRecord" +#define NID_nSRecord 481 +#define OBJ_nSRecord OBJ_pilotAttributeType,29L + +#define LN_sOARecord "sOARecord" +#define NID_sOARecord 482 +#define OBJ_sOARecord OBJ_pilotAttributeType,30L + +#define LN_cNAMERecord "cNAMERecord" +#define NID_cNAMERecord 483 +#define OBJ_cNAMERecord OBJ_pilotAttributeType,31L + +#define LN_associatedDomain "associatedDomain" +#define NID_associatedDomain 484 +#define OBJ_associatedDomain OBJ_pilotAttributeType,37L + +#define LN_associatedName "associatedName" +#define NID_associatedName 485 +#define OBJ_associatedName OBJ_pilotAttributeType,38L + +#define LN_homePostalAddress "homePostalAddress" +#define NID_homePostalAddress 486 +#define OBJ_homePostalAddress OBJ_pilotAttributeType,39L + +#define LN_personalTitle "personalTitle" +#define NID_personalTitle 487 +#define OBJ_personalTitle OBJ_pilotAttributeType,40L + +#define LN_mobileTelephoneNumber "mobileTelephoneNumber" +#define NID_mobileTelephoneNumber 488 +#define OBJ_mobileTelephoneNumber OBJ_pilotAttributeType,41L + +#define LN_pagerTelephoneNumber "pagerTelephoneNumber" +#define NID_pagerTelephoneNumber 489 +#define OBJ_pagerTelephoneNumber OBJ_pilotAttributeType,42L + +#define LN_friendlyCountryName "friendlyCountryName" +#define NID_friendlyCountryName 490 +#define OBJ_friendlyCountryName OBJ_pilotAttributeType,43L + +#define LN_organizationalStatus "organizationalStatus" +#define NID_organizationalStatus 491 +#define OBJ_organizationalStatus OBJ_pilotAttributeType,45L + +#define LN_janetMailbox "janetMailbox" +#define NID_janetMailbox 492 +#define OBJ_janetMailbox OBJ_pilotAttributeType,46L + +#define LN_mailPreferenceOption "mailPreferenceOption" +#define NID_mailPreferenceOption 493 +#define OBJ_mailPreferenceOption OBJ_pilotAttributeType,47L + +#define LN_buildingName "buildingName" +#define NID_buildingName 494 +#define OBJ_buildingName OBJ_pilotAttributeType,48L + +#define LN_dSAQuality "dSAQuality" +#define NID_dSAQuality 495 +#define OBJ_dSAQuality OBJ_pilotAttributeType,49L + +#define LN_singleLevelQuality "singleLevelQuality" +#define NID_singleLevelQuality 496 +#define OBJ_singleLevelQuality OBJ_pilotAttributeType,50L + +#define LN_subtreeMinimumQuality "subtreeMinimumQuality" +#define NID_subtreeMinimumQuality 497 +#define OBJ_subtreeMinimumQuality OBJ_pilotAttributeType,51L + +#define LN_subtreeMaximumQuality "subtreeMaximumQuality" +#define NID_subtreeMaximumQuality 498 +#define OBJ_subtreeMaximumQuality OBJ_pilotAttributeType,52L + +#define LN_personalSignature "personalSignature" +#define NID_personalSignature 499 +#define OBJ_personalSignature OBJ_pilotAttributeType,53L + +#define LN_dITRedirect "dITRedirect" +#define NID_dITRedirect 500 +#define OBJ_dITRedirect OBJ_pilotAttributeType,54L + +#define SN_audio "audio" +#define NID_audio 501 +#define OBJ_audio OBJ_pilotAttributeType,55L + +#define LN_documentPublisher "documentPublisher" +#define NID_documentPublisher 502 +#define OBJ_documentPublisher OBJ_pilotAttributeType,56L + +#define SN_id_set "id-set" +#define LN_id_set "Secure Electronic Transactions" +#define NID_id_set 512 +#define OBJ_id_set OBJ_international_organizations,42L + +#define SN_set_ctype "set-ctype" +#define LN_set_ctype "content types" +#define NID_set_ctype 513 +#define OBJ_set_ctype OBJ_id_set,0L + +#define SN_set_msgExt "set-msgExt" +#define LN_set_msgExt "message extensions" +#define NID_set_msgExt 514 +#define OBJ_set_msgExt OBJ_id_set,1L + +#define SN_set_attr "set-attr" +#define NID_set_attr 515 +#define OBJ_set_attr OBJ_id_set,3L + +#define SN_set_policy "set-policy" +#define NID_set_policy 516 +#define OBJ_set_policy OBJ_id_set,5L + +#define SN_set_certExt "set-certExt" +#define LN_set_certExt "certificate extensions" +#define NID_set_certExt 517 +#define OBJ_set_certExt OBJ_id_set,7L + +#define SN_set_brand "set-brand" +#define NID_set_brand 518 +#define OBJ_set_brand OBJ_id_set,8L + +#define SN_setct_PANData "setct-PANData" +#define NID_setct_PANData 519 +#define OBJ_setct_PANData OBJ_set_ctype,0L + +#define SN_setct_PANToken "setct-PANToken" +#define NID_setct_PANToken 520 +#define OBJ_setct_PANToken OBJ_set_ctype,1L + +#define SN_setct_PANOnly "setct-PANOnly" +#define NID_setct_PANOnly 521 +#define OBJ_setct_PANOnly OBJ_set_ctype,2L + +#define SN_setct_OIData "setct-OIData" +#define NID_setct_OIData 522 +#define OBJ_setct_OIData OBJ_set_ctype,3L + +#define SN_setct_PI "setct-PI" +#define NID_setct_PI 523 +#define OBJ_setct_PI OBJ_set_ctype,4L + +#define SN_setct_PIData "setct-PIData" +#define NID_setct_PIData 524 +#define OBJ_setct_PIData OBJ_set_ctype,5L + +#define SN_setct_PIDataUnsigned "setct-PIDataUnsigned" +#define NID_setct_PIDataUnsigned 525 +#define OBJ_setct_PIDataUnsigned OBJ_set_ctype,6L + +#define SN_setct_HODInput "setct-HODInput" +#define NID_setct_HODInput 526 +#define OBJ_setct_HODInput OBJ_set_ctype,7L + +#define SN_setct_AuthResBaggage "setct-AuthResBaggage" +#define NID_setct_AuthResBaggage 527 +#define OBJ_setct_AuthResBaggage OBJ_set_ctype,8L + +#define SN_setct_AuthRevReqBaggage "setct-AuthRevReqBaggage" +#define NID_setct_AuthRevReqBaggage 528 +#define OBJ_setct_AuthRevReqBaggage OBJ_set_ctype,9L + +#define SN_setct_AuthRevResBaggage "setct-AuthRevResBaggage" +#define NID_setct_AuthRevResBaggage 529 +#define OBJ_setct_AuthRevResBaggage OBJ_set_ctype,10L + +#define SN_setct_CapTokenSeq "setct-CapTokenSeq" +#define NID_setct_CapTokenSeq 530 +#define OBJ_setct_CapTokenSeq OBJ_set_ctype,11L + +#define SN_setct_PInitResData "setct-PInitResData" +#define NID_setct_PInitResData 531 +#define OBJ_setct_PInitResData OBJ_set_ctype,12L + +#define SN_setct_PI_TBS "setct-PI-TBS" +#define NID_setct_PI_TBS 532 +#define OBJ_setct_PI_TBS OBJ_set_ctype,13L + +#define SN_setct_PResData "setct-PResData" +#define NID_setct_PResData 533 +#define OBJ_setct_PResData OBJ_set_ctype,14L + +#define SN_setct_AuthReqTBS "setct-AuthReqTBS" +#define NID_setct_AuthReqTBS 534 +#define OBJ_setct_AuthReqTBS OBJ_set_ctype,16L + +#define SN_setct_AuthResTBS "setct-AuthResTBS" +#define NID_setct_AuthResTBS 535 +#define OBJ_setct_AuthResTBS OBJ_set_ctype,17L + +#define SN_setct_AuthResTBSX "setct-AuthResTBSX" +#define NID_setct_AuthResTBSX 536 +#define OBJ_setct_AuthResTBSX OBJ_set_ctype,18L + +#define SN_setct_AuthTokenTBS "setct-AuthTokenTBS" +#define NID_setct_AuthTokenTBS 537 +#define OBJ_setct_AuthTokenTBS OBJ_set_ctype,19L + +#define SN_setct_CapTokenData "setct-CapTokenData" +#define NID_setct_CapTokenData 538 +#define OBJ_setct_CapTokenData OBJ_set_ctype,20L + +#define SN_setct_CapTokenTBS "setct-CapTokenTBS" +#define NID_setct_CapTokenTBS 539 +#define OBJ_setct_CapTokenTBS OBJ_set_ctype,21L + +#define SN_setct_AcqCardCodeMsg "setct-AcqCardCodeMsg" +#define NID_setct_AcqCardCodeMsg 540 +#define OBJ_setct_AcqCardCodeMsg OBJ_set_ctype,22L + +#define SN_setct_AuthRevReqTBS "setct-AuthRevReqTBS" +#define NID_setct_AuthRevReqTBS 541 +#define OBJ_setct_AuthRevReqTBS OBJ_set_ctype,23L + +#define SN_setct_AuthRevResData "setct-AuthRevResData" +#define NID_setct_AuthRevResData 542 +#define OBJ_setct_AuthRevResData OBJ_set_ctype,24L + +#define SN_setct_AuthRevResTBS "setct-AuthRevResTBS" +#define NID_setct_AuthRevResTBS 543 +#define OBJ_setct_AuthRevResTBS OBJ_set_ctype,25L + +#define SN_setct_CapReqTBS "setct-CapReqTBS" +#define NID_setct_CapReqTBS 544 +#define OBJ_setct_CapReqTBS OBJ_set_ctype,26L + +#define SN_setct_CapReqTBSX "setct-CapReqTBSX" +#define NID_setct_CapReqTBSX 545 +#define OBJ_setct_CapReqTBSX OBJ_set_ctype,27L + +#define SN_setct_CapResData "setct-CapResData" +#define NID_setct_CapResData 546 +#define OBJ_setct_CapResData OBJ_set_ctype,28L + +#define SN_setct_CapRevReqTBS "setct-CapRevReqTBS" +#define NID_setct_CapRevReqTBS 547 +#define OBJ_setct_CapRevReqTBS OBJ_set_ctype,29L + +#define SN_setct_CapRevReqTBSX "setct-CapRevReqTBSX" +#define NID_setct_CapRevReqTBSX 548 +#define OBJ_setct_CapRevReqTBSX OBJ_set_ctype,30L + +#define SN_setct_CapRevResData "setct-CapRevResData" +#define NID_setct_CapRevResData 549 +#define OBJ_setct_CapRevResData OBJ_set_ctype,31L + +#define SN_setct_CredReqTBS "setct-CredReqTBS" +#define NID_setct_CredReqTBS 550 +#define OBJ_setct_CredReqTBS OBJ_set_ctype,32L + +#define SN_setct_CredReqTBSX "setct-CredReqTBSX" +#define NID_setct_CredReqTBSX 551 +#define OBJ_setct_CredReqTBSX OBJ_set_ctype,33L + +#define SN_setct_CredResData "setct-CredResData" +#define NID_setct_CredResData 552 +#define OBJ_setct_CredResData OBJ_set_ctype,34L + +#define SN_setct_CredRevReqTBS "setct-CredRevReqTBS" +#define NID_setct_CredRevReqTBS 553 +#define OBJ_setct_CredRevReqTBS OBJ_set_ctype,35L + +#define SN_setct_CredRevReqTBSX "setct-CredRevReqTBSX" +#define NID_setct_CredRevReqTBSX 554 +#define OBJ_setct_CredRevReqTBSX OBJ_set_ctype,36L + +#define SN_setct_CredRevResData "setct-CredRevResData" +#define NID_setct_CredRevResData 555 +#define OBJ_setct_CredRevResData OBJ_set_ctype,37L + +#define SN_setct_PCertReqData "setct-PCertReqData" +#define NID_setct_PCertReqData 556 +#define OBJ_setct_PCertReqData OBJ_set_ctype,38L + +#define SN_setct_PCertResTBS "setct-PCertResTBS" +#define NID_setct_PCertResTBS 557 +#define OBJ_setct_PCertResTBS OBJ_set_ctype,39L + +#define SN_setct_BatchAdminReqData "setct-BatchAdminReqData" +#define NID_setct_BatchAdminReqData 558 +#define OBJ_setct_BatchAdminReqData OBJ_set_ctype,40L + +#define SN_setct_BatchAdminResData "setct-BatchAdminResData" +#define NID_setct_BatchAdminResData 559 +#define OBJ_setct_BatchAdminResData OBJ_set_ctype,41L + +#define SN_setct_CardCInitResTBS "setct-CardCInitResTBS" +#define NID_setct_CardCInitResTBS 560 +#define OBJ_setct_CardCInitResTBS OBJ_set_ctype,42L + +#define SN_setct_MeAqCInitResTBS "setct-MeAqCInitResTBS" +#define NID_setct_MeAqCInitResTBS 561 +#define OBJ_setct_MeAqCInitResTBS OBJ_set_ctype,43L + +#define SN_setct_RegFormResTBS "setct-RegFormResTBS" +#define NID_setct_RegFormResTBS 562 +#define OBJ_setct_RegFormResTBS OBJ_set_ctype,44L + +#define SN_setct_CertReqData "setct-CertReqData" +#define NID_setct_CertReqData 563 +#define OBJ_setct_CertReqData OBJ_set_ctype,45L + +#define SN_setct_CertReqTBS "setct-CertReqTBS" +#define NID_setct_CertReqTBS 564 +#define OBJ_setct_CertReqTBS OBJ_set_ctype,46L + +#define SN_setct_CertResData "setct-CertResData" +#define NID_setct_CertResData 565 +#define OBJ_setct_CertResData OBJ_set_ctype,47L + +#define SN_setct_CertInqReqTBS "setct-CertInqReqTBS" +#define NID_setct_CertInqReqTBS 566 +#define OBJ_setct_CertInqReqTBS OBJ_set_ctype,48L + +#define SN_setct_ErrorTBS "setct-ErrorTBS" +#define NID_setct_ErrorTBS 567 +#define OBJ_setct_ErrorTBS OBJ_set_ctype,49L + +#define SN_setct_PIDualSignedTBE "setct-PIDualSignedTBE" +#define NID_setct_PIDualSignedTBE 568 +#define OBJ_setct_PIDualSignedTBE OBJ_set_ctype,50L + +#define SN_setct_PIUnsignedTBE "setct-PIUnsignedTBE" +#define NID_setct_PIUnsignedTBE 569 +#define OBJ_setct_PIUnsignedTBE OBJ_set_ctype,51L + +#define SN_setct_AuthReqTBE "setct-AuthReqTBE" +#define NID_setct_AuthReqTBE 570 +#define OBJ_setct_AuthReqTBE OBJ_set_ctype,52L + +#define SN_setct_AuthResTBE "setct-AuthResTBE" +#define NID_setct_AuthResTBE 571 +#define OBJ_setct_AuthResTBE OBJ_set_ctype,53L + +#define SN_setct_AuthResTBEX "setct-AuthResTBEX" +#define NID_setct_AuthResTBEX 572 +#define OBJ_setct_AuthResTBEX OBJ_set_ctype,54L + +#define SN_setct_AuthTokenTBE "setct-AuthTokenTBE" +#define NID_setct_AuthTokenTBE 573 +#define OBJ_setct_AuthTokenTBE OBJ_set_ctype,55L + +#define SN_setct_CapTokenTBE "setct-CapTokenTBE" +#define NID_setct_CapTokenTBE 574 +#define OBJ_setct_CapTokenTBE OBJ_set_ctype,56L + +#define SN_setct_CapTokenTBEX "setct-CapTokenTBEX" +#define NID_setct_CapTokenTBEX 575 +#define OBJ_setct_CapTokenTBEX OBJ_set_ctype,57L + +#define SN_setct_AcqCardCodeMsgTBE "setct-AcqCardCodeMsgTBE" +#define NID_setct_AcqCardCodeMsgTBE 576 +#define OBJ_setct_AcqCardCodeMsgTBE OBJ_set_ctype,58L + +#define SN_setct_AuthRevReqTBE "setct-AuthRevReqTBE" +#define NID_setct_AuthRevReqTBE 577 +#define OBJ_setct_AuthRevReqTBE OBJ_set_ctype,59L + +#define SN_setct_AuthRevResTBE "setct-AuthRevResTBE" +#define NID_setct_AuthRevResTBE 578 +#define OBJ_setct_AuthRevResTBE OBJ_set_ctype,60L + +#define SN_setct_AuthRevResTBEB "setct-AuthRevResTBEB" +#define NID_setct_AuthRevResTBEB 579 +#define OBJ_setct_AuthRevResTBEB OBJ_set_ctype,61L + +#define SN_setct_CapReqTBE "setct-CapReqTBE" +#define NID_setct_CapReqTBE 580 +#define OBJ_setct_CapReqTBE OBJ_set_ctype,62L + +#define SN_setct_CapReqTBEX "setct-CapReqTBEX" +#define NID_setct_CapReqTBEX 581 +#define OBJ_setct_CapReqTBEX OBJ_set_ctype,63L + +#define SN_setct_CapResTBE "setct-CapResTBE" +#define NID_setct_CapResTBE 582 +#define OBJ_setct_CapResTBE OBJ_set_ctype,64L + +#define SN_setct_CapRevReqTBE "setct-CapRevReqTBE" +#define NID_setct_CapRevReqTBE 583 +#define OBJ_setct_CapRevReqTBE OBJ_set_ctype,65L + +#define SN_setct_CapRevReqTBEX "setct-CapRevReqTBEX" +#define NID_setct_CapRevReqTBEX 584 +#define OBJ_setct_CapRevReqTBEX OBJ_set_ctype,66L + +#define SN_setct_CapRevResTBE "setct-CapRevResTBE" +#define NID_setct_CapRevResTBE 585 +#define OBJ_setct_CapRevResTBE OBJ_set_ctype,67L + +#define SN_setct_CredReqTBE "setct-CredReqTBE" +#define NID_setct_CredReqTBE 586 +#define OBJ_setct_CredReqTBE OBJ_set_ctype,68L + +#define SN_setct_CredReqTBEX "setct-CredReqTBEX" +#define NID_setct_CredReqTBEX 587 +#define OBJ_setct_CredReqTBEX OBJ_set_ctype,69L + +#define SN_setct_CredResTBE "setct-CredResTBE" +#define NID_setct_CredResTBE 588 +#define OBJ_setct_CredResTBE OBJ_set_ctype,70L + +#define SN_setct_CredRevReqTBE "setct-CredRevReqTBE" +#define NID_setct_CredRevReqTBE 589 +#define OBJ_setct_CredRevReqTBE OBJ_set_ctype,71L + +#define SN_setct_CredRevReqTBEX "setct-CredRevReqTBEX" +#define NID_setct_CredRevReqTBEX 590 +#define OBJ_setct_CredRevReqTBEX OBJ_set_ctype,72L + +#define SN_setct_CredRevResTBE "setct-CredRevResTBE" +#define NID_setct_CredRevResTBE 591 +#define OBJ_setct_CredRevResTBE OBJ_set_ctype,73L + +#define SN_setct_BatchAdminReqTBE "setct-BatchAdminReqTBE" +#define NID_setct_BatchAdminReqTBE 592 +#define OBJ_setct_BatchAdminReqTBE OBJ_set_ctype,74L + +#define SN_setct_BatchAdminResTBE "setct-BatchAdminResTBE" +#define NID_setct_BatchAdminResTBE 593 +#define OBJ_setct_BatchAdminResTBE OBJ_set_ctype,75L + +#define SN_setct_RegFormReqTBE "setct-RegFormReqTBE" +#define NID_setct_RegFormReqTBE 594 +#define OBJ_setct_RegFormReqTBE OBJ_set_ctype,76L + +#define SN_setct_CertReqTBE "setct-CertReqTBE" +#define NID_setct_CertReqTBE 595 +#define OBJ_setct_CertReqTBE OBJ_set_ctype,77L + +#define SN_setct_CertReqTBEX "setct-CertReqTBEX" +#define NID_setct_CertReqTBEX 596 +#define OBJ_setct_CertReqTBEX OBJ_set_ctype,78L + +#define SN_setct_CertResTBE "setct-CertResTBE" +#define NID_setct_CertResTBE 597 +#define OBJ_setct_CertResTBE OBJ_set_ctype,79L + +#define SN_setct_CRLNotificationTBS "setct-CRLNotificationTBS" +#define NID_setct_CRLNotificationTBS 598 +#define OBJ_setct_CRLNotificationTBS OBJ_set_ctype,80L + +#define SN_setct_CRLNotificationResTBS "setct-CRLNotificationResTBS" +#define NID_setct_CRLNotificationResTBS 599 +#define OBJ_setct_CRLNotificationResTBS OBJ_set_ctype,81L + +#define SN_setct_BCIDistributionTBS "setct-BCIDistributionTBS" +#define NID_setct_BCIDistributionTBS 600 +#define OBJ_setct_BCIDistributionTBS OBJ_set_ctype,82L + +#define SN_setext_genCrypt "setext-genCrypt" +#define LN_setext_genCrypt "generic cryptogram" +#define NID_setext_genCrypt 601 +#define OBJ_setext_genCrypt OBJ_set_msgExt,1L + +#define SN_setext_miAuth "setext-miAuth" +#define LN_setext_miAuth "merchant initiated auth" +#define NID_setext_miAuth 602 +#define OBJ_setext_miAuth OBJ_set_msgExt,3L + +#define SN_setext_pinSecure "setext-pinSecure" +#define NID_setext_pinSecure 603 +#define OBJ_setext_pinSecure OBJ_set_msgExt,4L + +#define SN_setext_pinAny "setext-pinAny" +#define NID_setext_pinAny 604 +#define OBJ_setext_pinAny OBJ_set_msgExt,5L + +#define SN_setext_track2 "setext-track2" +#define NID_setext_track2 605 +#define OBJ_setext_track2 OBJ_set_msgExt,7L + +#define SN_setext_cv "setext-cv" +#define LN_setext_cv "additional verification" +#define NID_setext_cv 606 +#define OBJ_setext_cv OBJ_set_msgExt,8L + +#define SN_set_policy_root "set-policy-root" +#define NID_set_policy_root 607 +#define OBJ_set_policy_root OBJ_set_policy,0L + +#define SN_setCext_hashedRoot "setCext-hashedRoot" +#define NID_setCext_hashedRoot 608 +#define OBJ_setCext_hashedRoot OBJ_set_certExt,0L + +#define SN_setCext_certType "setCext-certType" +#define NID_setCext_certType 609 +#define OBJ_setCext_certType OBJ_set_certExt,1L + +#define SN_setCext_merchData "setCext-merchData" +#define NID_setCext_merchData 610 +#define OBJ_setCext_merchData OBJ_set_certExt,2L + +#define SN_setCext_cCertRequired "setCext-cCertRequired" +#define NID_setCext_cCertRequired 611 +#define OBJ_setCext_cCertRequired OBJ_set_certExt,3L + +#define SN_setCext_tunneling "setCext-tunneling" +#define NID_setCext_tunneling 612 +#define OBJ_setCext_tunneling OBJ_set_certExt,4L + +#define SN_setCext_setExt "setCext-setExt" +#define NID_setCext_setExt 613 +#define OBJ_setCext_setExt OBJ_set_certExt,5L + +#define SN_setCext_setQualf "setCext-setQualf" +#define NID_setCext_setQualf 614 +#define OBJ_setCext_setQualf OBJ_set_certExt,6L + +#define SN_setCext_PGWYcapabilities "setCext-PGWYcapabilities" +#define NID_setCext_PGWYcapabilities 615 +#define OBJ_setCext_PGWYcapabilities OBJ_set_certExt,7L + +#define SN_setCext_TokenIdentifier "setCext-TokenIdentifier" +#define NID_setCext_TokenIdentifier 616 +#define OBJ_setCext_TokenIdentifier OBJ_set_certExt,8L + +#define SN_setCext_Track2Data "setCext-Track2Data" +#define NID_setCext_Track2Data 617 +#define OBJ_setCext_Track2Data OBJ_set_certExt,9L + +#define SN_setCext_TokenType "setCext-TokenType" +#define NID_setCext_TokenType 618 +#define OBJ_setCext_TokenType OBJ_set_certExt,10L + +#define SN_setCext_IssuerCapabilities "setCext-IssuerCapabilities" +#define NID_setCext_IssuerCapabilities 619 +#define OBJ_setCext_IssuerCapabilities OBJ_set_certExt,11L + +#define SN_setAttr_Cert "setAttr-Cert" +#define NID_setAttr_Cert 620 +#define OBJ_setAttr_Cert OBJ_set_attr,0L + +#define SN_setAttr_PGWYcap "setAttr-PGWYcap" +#define LN_setAttr_PGWYcap "payment gateway capabilities" +#define NID_setAttr_PGWYcap 621 +#define OBJ_setAttr_PGWYcap OBJ_set_attr,1L + +#define SN_setAttr_TokenType "setAttr-TokenType" +#define NID_setAttr_TokenType 622 +#define OBJ_setAttr_TokenType OBJ_set_attr,2L + +#define SN_setAttr_IssCap "setAttr-IssCap" +#define LN_setAttr_IssCap "issuer capabilities" +#define NID_setAttr_IssCap 623 +#define OBJ_setAttr_IssCap OBJ_set_attr,3L + +#define SN_set_rootKeyThumb "set-rootKeyThumb" +#define NID_set_rootKeyThumb 624 +#define OBJ_set_rootKeyThumb OBJ_setAttr_Cert,0L + +#define SN_set_addPolicy "set-addPolicy" +#define NID_set_addPolicy 625 +#define OBJ_set_addPolicy OBJ_setAttr_Cert,1L + +#define SN_setAttr_Token_EMV "setAttr-Token-EMV" +#define NID_setAttr_Token_EMV 626 +#define OBJ_setAttr_Token_EMV OBJ_setAttr_TokenType,1L + +#define SN_setAttr_Token_B0Prime "setAttr-Token-B0Prime" +#define NID_setAttr_Token_B0Prime 627 +#define OBJ_setAttr_Token_B0Prime OBJ_setAttr_TokenType,2L + +#define SN_setAttr_IssCap_CVM "setAttr-IssCap-CVM" +#define NID_setAttr_IssCap_CVM 628 +#define OBJ_setAttr_IssCap_CVM OBJ_setAttr_IssCap,3L + +#define SN_setAttr_IssCap_T2 "setAttr-IssCap-T2" +#define NID_setAttr_IssCap_T2 629 +#define OBJ_setAttr_IssCap_T2 OBJ_setAttr_IssCap,4L + +#define SN_setAttr_IssCap_Sig "setAttr-IssCap-Sig" +#define NID_setAttr_IssCap_Sig 630 +#define OBJ_setAttr_IssCap_Sig OBJ_setAttr_IssCap,5L + +#define SN_setAttr_GenCryptgrm "setAttr-GenCryptgrm" +#define LN_setAttr_GenCryptgrm "generate cryptogram" +#define NID_setAttr_GenCryptgrm 631 +#define OBJ_setAttr_GenCryptgrm OBJ_setAttr_IssCap_CVM,1L + +#define SN_setAttr_T2Enc "setAttr-T2Enc" +#define LN_setAttr_T2Enc "encrypted track 2" +#define NID_setAttr_T2Enc 632 +#define OBJ_setAttr_T2Enc OBJ_setAttr_IssCap_T2,1L + +#define SN_setAttr_T2cleartxt "setAttr-T2cleartxt" +#define LN_setAttr_T2cleartxt "cleartext track 2" +#define NID_setAttr_T2cleartxt 633 +#define OBJ_setAttr_T2cleartxt OBJ_setAttr_IssCap_T2,2L + +#define SN_setAttr_TokICCsig "setAttr-TokICCsig" +#define LN_setAttr_TokICCsig "ICC or token signature" +#define NID_setAttr_TokICCsig 634 +#define OBJ_setAttr_TokICCsig OBJ_setAttr_IssCap_Sig,1L + +#define SN_setAttr_SecDevSig "setAttr-SecDevSig" +#define LN_setAttr_SecDevSig "secure device signature" +#define NID_setAttr_SecDevSig 635 +#define OBJ_setAttr_SecDevSig OBJ_setAttr_IssCap_Sig,2L + +#define SN_set_brand_IATA_ATA "set-brand-IATA-ATA" +#define NID_set_brand_IATA_ATA 636 +#define OBJ_set_brand_IATA_ATA OBJ_set_brand,1L + +#define SN_set_brand_Diners "set-brand-Diners" +#define NID_set_brand_Diners 637 +#define OBJ_set_brand_Diners OBJ_set_brand,30L + +#define SN_set_brand_AmericanExpress "set-brand-AmericanExpress" +#define NID_set_brand_AmericanExpress 638 +#define OBJ_set_brand_AmericanExpress OBJ_set_brand,34L + +#define SN_set_brand_JCB "set-brand-JCB" +#define NID_set_brand_JCB 639 +#define OBJ_set_brand_JCB OBJ_set_brand,35L + +#define SN_set_brand_Visa "set-brand-Visa" +#define NID_set_brand_Visa 640 +#define OBJ_set_brand_Visa OBJ_set_brand,4L + +#define SN_set_brand_MasterCard "set-brand-MasterCard" +#define NID_set_brand_MasterCard 641 +#define OBJ_set_brand_MasterCard OBJ_set_brand,5L + +#define SN_set_brand_Novus "set-brand-Novus" +#define NID_set_brand_Novus 642 +#define OBJ_set_brand_Novus OBJ_set_brand,6011L + +#define SN_des_cdmf "DES-CDMF" +#define LN_des_cdmf "des-cdmf" +#define NID_des_cdmf 643 +#define OBJ_des_cdmf OBJ_rsadsi,3L,10L + +#define SN_rsaOAEPEncryptionSET "rsaOAEPEncryptionSET" +#define NID_rsaOAEPEncryptionSET 644 +#define OBJ_rsaOAEPEncryptionSET OBJ_rsadsi,1L,1L,6L + +#define SN_ipsec3 "Oakley-EC2N-3" +#define LN_ipsec3 "ipsec3" +#define NID_ipsec3 749 + +#define SN_ipsec4 "Oakley-EC2N-4" +#define LN_ipsec4 "ipsec4" +#define NID_ipsec4 750 + +#define SN_camellia_128_cbc "CAMELLIA-128-CBC" +#define LN_camellia_128_cbc "camellia-128-cbc" +#define NID_camellia_128_cbc 751 +#define OBJ_camellia_128_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,2L + +#define SN_camellia_192_cbc "CAMELLIA-192-CBC" +#define LN_camellia_192_cbc "camellia-192-cbc" +#define NID_camellia_192_cbc 752 +#define OBJ_camellia_192_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,3L + +#define SN_camellia_256_cbc "CAMELLIA-256-CBC" +#define LN_camellia_256_cbc "camellia-256-cbc" +#define NID_camellia_256_cbc 753 +#define OBJ_camellia_256_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,4L + +#define OBJ_ntt_ds 0L,3L,4401L,5L + +#define OBJ_camellia OBJ_ntt_ds,3L,1L,9L + +#define SN_camellia_128_ecb "CAMELLIA-128-ECB" +#define LN_camellia_128_ecb "camellia-128-ecb" +#define NID_camellia_128_ecb 754 +#define OBJ_camellia_128_ecb OBJ_camellia,1L + +#define SN_camellia_128_ofb128 "CAMELLIA-128-OFB" +#define LN_camellia_128_ofb128 "camellia-128-ofb" +#define NID_camellia_128_ofb128 766 +#define OBJ_camellia_128_ofb128 OBJ_camellia,3L + +#define SN_camellia_128_cfb128 "CAMELLIA-128-CFB" +#define LN_camellia_128_cfb128 "camellia-128-cfb" +#define NID_camellia_128_cfb128 757 +#define OBJ_camellia_128_cfb128 OBJ_camellia,4L + +#define SN_camellia_192_ecb "CAMELLIA-192-ECB" +#define LN_camellia_192_ecb "camellia-192-ecb" +#define NID_camellia_192_ecb 755 +#define OBJ_camellia_192_ecb OBJ_camellia,21L + +#define SN_camellia_192_ofb128 "CAMELLIA-192-OFB" +#define LN_camellia_192_ofb128 "camellia-192-ofb" +#define NID_camellia_192_ofb128 767 +#define OBJ_camellia_192_ofb128 OBJ_camellia,23L + +#define SN_camellia_192_cfb128 "CAMELLIA-192-CFB" +#define LN_camellia_192_cfb128 "camellia-192-cfb" +#define NID_camellia_192_cfb128 758 +#define OBJ_camellia_192_cfb128 OBJ_camellia,24L + +#define SN_camellia_256_ecb "CAMELLIA-256-ECB" +#define LN_camellia_256_ecb "camellia-256-ecb" +#define NID_camellia_256_ecb 756 +#define OBJ_camellia_256_ecb OBJ_camellia,41L + +#define SN_camellia_256_ofb128 "CAMELLIA-256-OFB" +#define LN_camellia_256_ofb128 "camellia-256-ofb" +#define NID_camellia_256_ofb128 768 +#define OBJ_camellia_256_ofb128 OBJ_camellia,43L + +#define SN_camellia_256_cfb128 "CAMELLIA-256-CFB" +#define LN_camellia_256_cfb128 "camellia-256-cfb" +#define NID_camellia_256_cfb128 759 +#define OBJ_camellia_256_cfb128 OBJ_camellia,44L + +#define SN_camellia_128_cfb1 "CAMELLIA-128-CFB1" +#define LN_camellia_128_cfb1 "camellia-128-cfb1" +#define NID_camellia_128_cfb1 760 + +#define SN_camellia_192_cfb1 "CAMELLIA-192-CFB1" +#define LN_camellia_192_cfb1 "camellia-192-cfb1" +#define NID_camellia_192_cfb1 761 + +#define SN_camellia_256_cfb1 "CAMELLIA-256-CFB1" +#define LN_camellia_256_cfb1 "camellia-256-cfb1" +#define NID_camellia_256_cfb1 762 + +#define SN_camellia_128_cfb8 "CAMELLIA-128-CFB8" +#define LN_camellia_128_cfb8 "camellia-128-cfb8" +#define NID_camellia_128_cfb8 763 + +#define SN_camellia_192_cfb8 "CAMELLIA-192-CFB8" +#define LN_camellia_192_cfb8 "camellia-192-cfb8" +#define NID_camellia_192_cfb8 764 + +#define SN_camellia_256_cfb8 "CAMELLIA-256-CFB8" +#define LN_camellia_256_cfb8 "camellia-256-cfb8" +#define NID_camellia_256_cfb8 765 + +#define SN_kisa "KISA" +#define LN_kisa "kisa" +#define NID_kisa 773 +#define OBJ_kisa OBJ_member_body,410L,200004L + +#define SN_seed_ecb "SEED-ECB" +#define LN_seed_ecb "seed-ecb" +#define NID_seed_ecb 776 +#define OBJ_seed_ecb OBJ_kisa,1L,3L + +#define SN_seed_cbc "SEED-CBC" +#define LN_seed_cbc "seed-cbc" +#define NID_seed_cbc 777 +#define OBJ_seed_cbc OBJ_kisa,1L,4L + +#define SN_seed_cfb128 "SEED-CFB" +#define LN_seed_cfb128 "seed-cfb" +#define NID_seed_cfb128 779 +#define OBJ_seed_cfb128 OBJ_kisa,1L,5L + +#define SN_seed_ofb128 "SEED-OFB" +#define LN_seed_ofb128 "seed-ofb" +#define NID_seed_ofb128 778 +#define OBJ_seed_ofb128 OBJ_kisa,1L,6L + diff --git a/mswin32/OpenSSL/include/openssl/objects.h b/mswin32/OpenSSL/include/openssl/objects.h new file mode 100755 index 000000000..7242f76fb --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/objects.h @@ -0,0 +1,1049 @@ +/* crypto/objects/objects.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.] + */ + +#ifndef HEADER_OBJECTS_H +#define HEADER_OBJECTS_H + +#define USE_OBJ_MAC + +#ifdef USE_OBJ_MAC +#include +#else +#define SN_undef "UNDEF" +#define LN_undef "undefined" +#define NID_undef 0 +#define OBJ_undef 0L + +#define SN_Algorithm "Algorithm" +#define LN_algorithm "algorithm" +#define NID_algorithm 38 +#define OBJ_algorithm 1L,3L,14L,3L,2L + +#define LN_rsadsi "rsadsi" +#define NID_rsadsi 1 +#define OBJ_rsadsi 1L,2L,840L,113549L + +#define LN_pkcs "pkcs" +#define NID_pkcs 2 +#define OBJ_pkcs OBJ_rsadsi,1L + +#define SN_md2 "MD2" +#define LN_md2 "md2" +#define NID_md2 3 +#define OBJ_md2 OBJ_rsadsi,2L,2L + +#define SN_md5 "MD5" +#define LN_md5 "md5" +#define NID_md5 4 +#define OBJ_md5 OBJ_rsadsi,2L,5L + +#define SN_rc4 "RC4" +#define LN_rc4 "rc4" +#define NID_rc4 5 +#define OBJ_rc4 OBJ_rsadsi,3L,4L + +#define LN_rsaEncryption "rsaEncryption" +#define NID_rsaEncryption 6 +#define OBJ_rsaEncryption OBJ_pkcs,1L,1L + +#define SN_md2WithRSAEncryption "RSA-MD2" +#define LN_md2WithRSAEncryption "md2WithRSAEncryption" +#define NID_md2WithRSAEncryption 7 +#define OBJ_md2WithRSAEncryption OBJ_pkcs,1L,2L + +#define SN_md5WithRSAEncryption "RSA-MD5" +#define LN_md5WithRSAEncryption "md5WithRSAEncryption" +#define NID_md5WithRSAEncryption 8 +#define OBJ_md5WithRSAEncryption OBJ_pkcs,1L,4L + +#define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +#define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +#define NID_pbeWithMD2AndDES_CBC 9 +#define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs,5L,1L + +#define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +#define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +#define NID_pbeWithMD5AndDES_CBC 10 +#define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs,5L,3L + +#define LN_X500 "X500" +#define NID_X500 11 +#define OBJ_X500 2L,5L + +#define LN_X509 "X509" +#define NID_X509 12 +#define OBJ_X509 OBJ_X500,4L + +#define SN_commonName "CN" +#define LN_commonName "commonName" +#define NID_commonName 13 +#define OBJ_commonName OBJ_X509,3L + +#define SN_countryName "C" +#define LN_countryName "countryName" +#define NID_countryName 14 +#define OBJ_countryName OBJ_X509,6L + +#define SN_localityName "L" +#define LN_localityName "localityName" +#define NID_localityName 15 +#define OBJ_localityName OBJ_X509,7L + +/* Postal Address? PA */ + +/* should be "ST" (rfc1327) but MS uses 'S' */ +#define SN_stateOrProvinceName "ST" +#define LN_stateOrProvinceName "stateOrProvinceName" +#define NID_stateOrProvinceName 16 +#define OBJ_stateOrProvinceName OBJ_X509,8L + +#define SN_organizationName "O" +#define LN_organizationName "organizationName" +#define NID_organizationName 17 +#define OBJ_organizationName OBJ_X509,10L + +#define SN_organizationalUnitName "OU" +#define LN_organizationalUnitName "organizationalUnitName" +#define NID_organizationalUnitName 18 +#define OBJ_organizationalUnitName OBJ_X509,11L + +#define SN_rsa "RSA" +#define LN_rsa "rsa" +#define NID_rsa 19 +#define OBJ_rsa OBJ_X500,8L,1L,1L + +#define LN_pkcs7 "pkcs7" +#define NID_pkcs7 20 +#define OBJ_pkcs7 OBJ_pkcs,7L + +#define LN_pkcs7_data "pkcs7-data" +#define NID_pkcs7_data 21 +#define OBJ_pkcs7_data OBJ_pkcs7,1L + +#define LN_pkcs7_signed "pkcs7-signedData" +#define NID_pkcs7_signed 22 +#define OBJ_pkcs7_signed OBJ_pkcs7,2L + +#define LN_pkcs7_enveloped "pkcs7-envelopedData" +#define NID_pkcs7_enveloped 23 +#define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +#define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +#define NID_pkcs7_signedAndEnveloped 24 +#define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +#define LN_pkcs7_digest "pkcs7-digestData" +#define NID_pkcs7_digest 25 +#define OBJ_pkcs7_digest OBJ_pkcs7,5L + +#define LN_pkcs7_encrypted "pkcs7-encryptedData" +#define NID_pkcs7_encrypted 26 +#define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +#define LN_pkcs3 "pkcs3" +#define NID_pkcs3 27 +#define OBJ_pkcs3 OBJ_pkcs,3L + +#define LN_dhKeyAgreement "dhKeyAgreement" +#define NID_dhKeyAgreement 28 +#define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +#define SN_des_ecb "DES-ECB" +#define LN_des_ecb "des-ecb" +#define NID_des_ecb 29 +#define OBJ_des_ecb OBJ_algorithm,6L + +#define SN_des_cfb64 "DES-CFB" +#define LN_des_cfb64 "des-cfb" +#define NID_des_cfb64 30 +/* IV + num */ +#define OBJ_des_cfb64 OBJ_algorithm,9L + +#define SN_des_cbc "DES-CBC" +#define LN_des_cbc "des-cbc" +#define NID_des_cbc 31 +/* IV */ +#define OBJ_des_cbc OBJ_algorithm,7L + +#define SN_des_ede "DES-EDE" +#define LN_des_ede "des-ede" +#define NID_des_ede 32 +/* ?? */ +#define OBJ_des_ede OBJ_algorithm,17L + +#define SN_des_ede3 "DES-EDE3" +#define LN_des_ede3 "des-ede3" +#define NID_des_ede3 33 + +#define SN_idea_cbc "IDEA-CBC" +#define LN_idea_cbc "idea-cbc" +#define NID_idea_cbc 34 +#define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +#define SN_idea_cfb64 "IDEA-CFB" +#define LN_idea_cfb64 "idea-cfb" +#define NID_idea_cfb64 35 + +#define SN_idea_ecb "IDEA-ECB" +#define LN_idea_ecb "idea-ecb" +#define NID_idea_ecb 36 + +#define SN_rc2_cbc "RC2-CBC" +#define LN_rc2_cbc "rc2-cbc" +#define NID_rc2_cbc 37 +#define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +#define SN_rc2_ecb "RC2-ECB" +#define LN_rc2_ecb "rc2-ecb" +#define NID_rc2_ecb 38 + +#define SN_rc2_cfb64 "RC2-CFB" +#define LN_rc2_cfb64 "rc2-cfb" +#define NID_rc2_cfb64 39 + +#define SN_rc2_ofb64 "RC2-OFB" +#define LN_rc2_ofb64 "rc2-ofb" +#define NID_rc2_ofb64 40 + +#define SN_sha "SHA" +#define LN_sha "sha" +#define NID_sha 41 +#define OBJ_sha OBJ_algorithm,18L + +#define SN_shaWithRSAEncryption "RSA-SHA" +#define LN_shaWithRSAEncryption "shaWithRSAEncryption" +#define NID_shaWithRSAEncryption 42 +#define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +#define SN_des_ede_cbc "DES-EDE-CBC" +#define LN_des_ede_cbc "des-ede-cbc" +#define NID_des_ede_cbc 43 + +#define SN_des_ede3_cbc "DES-EDE3-CBC" +#define LN_des_ede3_cbc "des-ede3-cbc" +#define NID_des_ede3_cbc 44 +#define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +#define SN_des_ofb64 "DES-OFB" +#define LN_des_ofb64 "des-ofb" +#define NID_des_ofb64 45 +#define OBJ_des_ofb64 OBJ_algorithm,8L + +#define SN_idea_ofb64 "IDEA-OFB" +#define LN_idea_ofb64 "idea-ofb" +#define NID_idea_ofb64 46 + +#define LN_pkcs9 "pkcs9" +#define NID_pkcs9 47 +#define OBJ_pkcs9 OBJ_pkcs,9L + +#define SN_pkcs9_emailAddress "Email" +#define LN_pkcs9_emailAddress "emailAddress" +#define NID_pkcs9_emailAddress 48 +#define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +#define LN_pkcs9_unstructuredName "unstructuredName" +#define NID_pkcs9_unstructuredName 49 +#define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +#define LN_pkcs9_contentType "contentType" +#define NID_pkcs9_contentType 50 +#define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +#define LN_pkcs9_messageDigest "messageDigest" +#define NID_pkcs9_messageDigest 51 +#define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +#define LN_pkcs9_signingTime "signingTime" +#define NID_pkcs9_signingTime 52 +#define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +#define LN_pkcs9_countersignature "countersignature" +#define NID_pkcs9_countersignature 53 +#define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +#define LN_pkcs9_challengePassword "challengePassword" +#define NID_pkcs9_challengePassword 54 +#define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +#define LN_pkcs9_unstructuredAddress "unstructuredAddress" +#define NID_pkcs9_unstructuredAddress 55 +#define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +#define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +#define NID_pkcs9_extCertAttributes 56 +#define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +#define SN_netscape "Netscape" +#define LN_netscape "Netscape Communications Corp." +#define NID_netscape 57 +#define OBJ_netscape 2L,16L,840L,1L,113730L + +#define SN_netscape_cert_extension "nsCertExt" +#define LN_netscape_cert_extension "Netscape Certificate Extension" +#define NID_netscape_cert_extension 58 +#define OBJ_netscape_cert_extension OBJ_netscape,1L + +#define SN_netscape_data_type "nsDataType" +#define LN_netscape_data_type "Netscape Data Type" +#define NID_netscape_data_type 59 +#define OBJ_netscape_data_type OBJ_netscape,2L + +#define SN_des_ede_cfb64 "DES-EDE-CFB" +#define LN_des_ede_cfb64 "des-ede-cfb" +#define NID_des_ede_cfb64 60 + +#define SN_des_ede3_cfb64 "DES-EDE3-CFB" +#define LN_des_ede3_cfb64 "des-ede3-cfb" +#define NID_des_ede3_cfb64 61 + +#define SN_des_ede_ofb64 "DES-EDE-OFB" +#define LN_des_ede_ofb64 "des-ede-ofb" +#define NID_des_ede_ofb64 62 + +#define SN_des_ede3_ofb64 "DES-EDE3-OFB" +#define LN_des_ede3_ofb64 "des-ede3-ofb" +#define NID_des_ede3_ofb64 63 + +/* I'm not sure about the object ID */ +#define SN_sha1 "SHA1" +#define LN_sha1 "sha1" +#define NID_sha1 64 +#define OBJ_sha1 OBJ_algorithm,26L +/* 28 Jun 1996 - eay */ +/* #define OBJ_sha1 1L,3L,14L,2L,26L,05L <- wrong */ + +#define SN_sha1WithRSAEncryption "RSA-SHA1" +#define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +#define NID_sha1WithRSAEncryption 65 +#define OBJ_sha1WithRSAEncryption OBJ_pkcs,1L,5L + +#define SN_dsaWithSHA "DSA-SHA" +#define LN_dsaWithSHA "dsaWithSHA" +#define NID_dsaWithSHA 66 +#define OBJ_dsaWithSHA OBJ_algorithm,13L + +#define SN_dsa_2 "DSA-old" +#define LN_dsa_2 "dsaEncryption-old" +#define NID_dsa_2 67 +#define OBJ_dsa_2 OBJ_algorithm,12L + +/* proposed by microsoft to RSA */ +#define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +#define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +#define NID_pbeWithSHA1AndRC2_CBC 68 +#define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs,5L,11L + +/* proposed by microsoft to RSA as pbeWithSHA1AndRC4: it is now + * defined explicitly in PKCS#5 v2.0 as id-PBKDF2 which is something + * completely different. + */ +#define LN_id_pbkdf2 "PBKDF2" +#define NID_id_pbkdf2 69 +#define OBJ_id_pbkdf2 OBJ_pkcs,5L,12L + +#define SN_dsaWithSHA1_2 "DSA-SHA1-old" +#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 + +#define SN_netscape_cert_type "nsCertType" +#define LN_netscape_cert_type "Netscape Cert Type" +#define NID_netscape_cert_type 71 +#define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +#define SN_netscape_base_url "nsBaseUrl" +#define LN_netscape_base_url "Netscape Base Url" +#define NID_netscape_base_url 72 +#define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +#define SN_netscape_revocation_url "nsRevocationUrl" +#define LN_netscape_revocation_url "Netscape Revocation Url" +#define NID_netscape_revocation_url 73 +#define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +#define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +#define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +#define NID_netscape_ca_revocation_url 74 +#define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +#define SN_netscape_renewal_url "nsRenewalUrl" +#define LN_netscape_renewal_url "Netscape Renewal Url" +#define NID_netscape_renewal_url 75 +#define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +#define SN_netscape_ca_policy_url "nsCaPolicyUrl" +#define LN_netscape_ca_policy_url "Netscape CA Policy Url" +#define NID_netscape_ca_policy_url 76 +#define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +#define SN_netscape_ssl_server_name "nsSslServerName" +#define LN_netscape_ssl_server_name "Netscape SSL Server Name" +#define NID_netscape_ssl_server_name 77 +#define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +#define SN_netscape_comment "nsComment" +#define LN_netscape_comment "Netscape Comment" +#define NID_netscape_comment 78 +#define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +#define SN_netscape_cert_sequence "nsCertSequence" +#define LN_netscape_cert_sequence "Netscape Certificate Sequence" +#define NID_netscape_cert_sequence 79 +#define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +#define SN_desx_cbc "DESX-CBC" +#define LN_desx_cbc "desx-cbc" +#define NID_desx_cbc 80 + +#define SN_id_ce "id-ce" +#define NID_id_ce 81 +#define OBJ_id_ce 2L,5L,29L + +#define SN_subject_key_identifier "subjectKeyIdentifier" +#define LN_subject_key_identifier "X509v3 Subject Key Identifier" +#define NID_subject_key_identifier 82 +#define OBJ_subject_key_identifier OBJ_id_ce,14L + +#define SN_key_usage "keyUsage" +#define LN_key_usage "X509v3 Key Usage" +#define NID_key_usage 83 +#define OBJ_key_usage OBJ_id_ce,15L + +#define SN_private_key_usage_period "privateKeyUsagePeriod" +#define LN_private_key_usage_period "X509v3 Private Key Usage Period" +#define NID_private_key_usage_period 84 +#define OBJ_private_key_usage_period OBJ_id_ce,16L + +#define SN_subject_alt_name "subjectAltName" +#define LN_subject_alt_name "X509v3 Subject Alternative Name" +#define NID_subject_alt_name 85 +#define OBJ_subject_alt_name OBJ_id_ce,17L + +#define SN_issuer_alt_name "issuerAltName" +#define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +#define NID_issuer_alt_name 86 +#define OBJ_issuer_alt_name OBJ_id_ce,18L + +#define SN_basic_constraints "basicConstraints" +#define LN_basic_constraints "X509v3 Basic Constraints" +#define NID_basic_constraints 87 +#define OBJ_basic_constraints OBJ_id_ce,19L + +#define SN_crl_number "crlNumber" +#define LN_crl_number "X509v3 CRL Number" +#define NID_crl_number 88 +#define OBJ_crl_number OBJ_id_ce,20L + +#define SN_certificate_policies "certificatePolicies" +#define LN_certificate_policies "X509v3 Certificate Policies" +#define NID_certificate_policies 89 +#define OBJ_certificate_policies OBJ_id_ce,32L + +#define SN_authority_key_identifier "authorityKeyIdentifier" +#define LN_authority_key_identifier "X509v3 Authority Key Identifier" +#define NID_authority_key_identifier 90 +#define OBJ_authority_key_identifier OBJ_id_ce,35L + +#define SN_bf_cbc "BF-CBC" +#define LN_bf_cbc "bf-cbc" +#define NID_bf_cbc 91 +#define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +#define SN_bf_ecb "BF-ECB" +#define LN_bf_ecb "bf-ecb" +#define NID_bf_ecb 92 + +#define SN_bf_cfb64 "BF-CFB" +#define LN_bf_cfb64 "bf-cfb" +#define NID_bf_cfb64 93 + +#define SN_bf_ofb64 "BF-OFB" +#define LN_bf_ofb64 "bf-ofb" +#define NID_bf_ofb64 94 + +#define SN_mdc2 "MDC2" +#define LN_mdc2 "mdc2" +#define NID_mdc2 95 +#define OBJ_mdc2 2L,5L,8L,3L,101L +/* An alternative? 1L,3L,14L,3L,2L,19L */ + +#define SN_mdc2WithRSA "RSA-MDC2" +#define LN_mdc2WithRSA "mdc2withRSA" +#define NID_mdc2WithRSA 96 +#define OBJ_mdc2WithRSA 2L,5L,8L,3L,100L + +#define SN_rc4_40 "RC4-40" +#define LN_rc4_40 "rc4-40" +#define NID_rc4_40 97 + +#define SN_rc2_40_cbc "RC2-40-CBC" +#define LN_rc2_40_cbc "rc2-40-cbc" +#define NID_rc2_40_cbc 98 + +#define SN_givenName "G" +#define LN_givenName "givenName" +#define NID_givenName 99 +#define OBJ_givenName OBJ_X509,42L + +#define SN_surname "S" +#define LN_surname "surname" +#define NID_surname 100 +#define OBJ_surname OBJ_X509,4L + +#define SN_initials "I" +#define LN_initials "initials" +#define NID_initials 101 +#define OBJ_initials OBJ_X509,43L + +#define SN_uniqueIdentifier "UID" +#define LN_uniqueIdentifier "uniqueIdentifier" +#define NID_uniqueIdentifier 102 +#define OBJ_uniqueIdentifier OBJ_X509,45L + +#define SN_crl_distribution_points "crlDistributionPoints" +#define LN_crl_distribution_points "X509v3 CRL Distribution Points" +#define NID_crl_distribution_points 103 +#define OBJ_crl_distribution_points OBJ_id_ce,31L + +#define SN_md5WithRSA "RSA-NP-MD5" +#define LN_md5WithRSA "md5WithRSA" +#define NID_md5WithRSA 104 +#define OBJ_md5WithRSA OBJ_algorithm,3L + +#define SN_serialNumber "SN" +#define LN_serialNumber "serialNumber" +#define NID_serialNumber 105 +#define OBJ_serialNumber OBJ_X509,5L + +#define SN_title "T" +#define LN_title "title" +#define NID_title 106 +#define OBJ_title OBJ_X509,12L + +#define SN_description "D" +#define LN_description "description" +#define NID_description 107 +#define OBJ_description OBJ_X509,13L + +/* CAST5 is CAST-128, I'm just sticking with the documentation */ +#define SN_cast5_cbc "CAST5-CBC" +#define LN_cast5_cbc "cast5-cbc" +#define NID_cast5_cbc 108 +#define OBJ_cast5_cbc 1L,2L,840L,113533L,7L,66L,10L + +#define SN_cast5_ecb "CAST5-ECB" +#define LN_cast5_ecb "cast5-ecb" +#define NID_cast5_ecb 109 + +#define SN_cast5_cfb64 "CAST5-CFB" +#define LN_cast5_cfb64 "cast5-cfb" +#define NID_cast5_cfb64 110 + +#define SN_cast5_ofb64 "CAST5-OFB" +#define LN_cast5_ofb64 "cast5-ofb" +#define NID_cast5_ofb64 111 + +#define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +#define NID_pbeWithMD5AndCast5_CBC 112 +#define OBJ_pbeWithMD5AndCast5_CBC 1L,2L,840L,113533L,7L,66L,12L + +/* This is one sun will soon be using :-( + * id-dsa-with-sha1 ID ::= { + * iso(1) member-body(2) us(840) x9-57 (10040) x9cm(4) 3 } + */ +#define SN_dsaWithSHA1 "DSA-SHA1" +#define LN_dsaWithSHA1 "dsaWithSHA1" +#define NID_dsaWithSHA1 113 +#define OBJ_dsaWithSHA1 1L,2L,840L,10040L,4L,3L + +#define NID_md5_sha1 114 +#define SN_md5_sha1 "MD5-SHA1" +#define LN_md5_sha1 "md5-sha1" + +#define SN_sha1WithRSA "RSA-SHA1-2" +#define LN_sha1WithRSA "sha1WithRSA" +#define NID_sha1WithRSA 115 +#define OBJ_sha1WithRSA OBJ_algorithm,29L + +#define SN_dsa "DSA" +#define LN_dsa "dsaEncryption" +#define NID_dsa 116 +#define OBJ_dsa 1L,2L,840L,10040L,4L,1L + +#define SN_ripemd160 "RIPEMD160" +#define LN_ripemd160 "ripemd160" +#define NID_ripemd160 117 +#define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +/* The name should actually be rsaSignatureWithripemd160, but I'm going + * to continue using the convention I'm using with the other ciphers */ +#define SN_ripemd160WithRSA "RSA-RIPEMD160" +#define LN_ripemd160WithRSA "ripemd160WithRSA" +#define NID_ripemd160WithRSA 119 +#define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +/* Taken from rfc2040 + * RC5_CBC_Parameters ::= SEQUENCE { + * version INTEGER (v1_0(16)), + * rounds INTEGER (8..127), + * blockSizeInBits INTEGER (64, 128), + * iv OCTET STRING OPTIONAL + * } + */ +#define SN_rc5_cbc "RC5-CBC" +#define LN_rc5_cbc "rc5-cbc" +#define NID_rc5_cbc 120 +#define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +#define SN_rc5_ecb "RC5-ECB" +#define LN_rc5_ecb "rc5-ecb" +#define NID_rc5_ecb 121 + +#define SN_rc5_cfb64 "RC5-CFB" +#define LN_rc5_cfb64 "rc5-cfb" +#define NID_rc5_cfb64 122 + +#define SN_rc5_ofb64 "RC5-OFB" +#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 + +#define SN_ext_key_usage "extendedKeyUsage" +#define LN_ext_key_usage "X509v3 Extended Key Usage" +#define NID_ext_key_usage 126 +#define OBJ_ext_key_usage OBJ_id_ce,37 + +#define SN_id_pkix "PKIX" +#define NID_id_pkix 127 +#define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +#define SN_id_kp "id-kp" +#define NID_id_kp 128 +#define OBJ_id_kp OBJ_id_pkix,3L + +/* PKIX extended key usage OIDs */ + +#define SN_server_auth "serverAuth" +#define LN_server_auth "TLS Web Server Authentication" +#define NID_server_auth 129 +#define OBJ_server_auth OBJ_id_kp,1L + +#define SN_client_auth "clientAuth" +#define LN_client_auth "TLS Web Client Authentication" +#define NID_client_auth 130 +#define OBJ_client_auth OBJ_id_kp,2L + +#define SN_code_sign "codeSigning" +#define LN_code_sign "Code Signing" +#define NID_code_sign 131 +#define OBJ_code_sign OBJ_id_kp,3L + +#define SN_email_protect "emailProtection" +#define LN_email_protect "E-mail Protection" +#define NID_email_protect 132 +#define OBJ_email_protect OBJ_id_kp,4L + +#define SN_time_stamp "timeStamping" +#define LN_time_stamp "Time Stamping" +#define NID_time_stamp 133 +#define OBJ_time_stamp OBJ_id_kp,8L + +/* Additional extended key usage OIDs: Microsoft */ + +#define SN_ms_code_ind "msCodeInd" +#define LN_ms_code_ind "Microsoft Individual Code Signing" +#define NID_ms_code_ind 134 +#define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +#define SN_ms_code_com "msCodeCom" +#define LN_ms_code_com "Microsoft Commercial Code Signing" +#define NID_ms_code_com 135 +#define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +#define SN_ms_ctl_sign "msCTLSign" +#define LN_ms_ctl_sign "Microsoft Trust List Signing" +#define NID_ms_ctl_sign 136 +#define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +#define SN_ms_sgc "msSGC" +#define LN_ms_sgc "Microsoft Server Gated Crypto" +#define NID_ms_sgc 137 +#define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +#define SN_ms_efs "msEFS" +#define LN_ms_efs "Microsoft Encrypted File System" +#define NID_ms_efs 138 +#define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +/* Additional usage: Netscape */ + +#define SN_ns_sgc "nsSGC" +#define LN_ns_sgc "Netscape Server Gated Crypto" +#define NID_ns_sgc 139 +#define OBJ_ns_sgc OBJ_netscape,4L,1L + +#define SN_delta_crl "deltaCRL" +#define LN_delta_crl "X509v3 Delta CRL Indicator" +#define NID_delta_crl 140 +#define OBJ_delta_crl OBJ_id_ce,27L + +#define SN_crl_reason "CRLReason" +#define LN_crl_reason "CRL Reason Code" +#define NID_crl_reason 141 +#define OBJ_crl_reason OBJ_id_ce,21L + +#define SN_invalidity_date "invalidityDate" +#define LN_invalidity_date "Invalidity Date" +#define NID_invalidity_date 142 +#define OBJ_invalidity_date OBJ_id_ce,24L + +#define SN_sxnet "SXNetID" +#define LN_sxnet "Strong Extranet ID" +#define NID_sxnet 143 +#define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +/* PKCS12 and related OBJECT IDENTIFIERS */ + +#define OBJ_pkcs12 OBJ_pkcs,12L +#define OBJ_pkcs12_pbeids OBJ_pkcs12, 1 + +#define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +#define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +#define NID_pbe_WithSHA1And128BitRC4 144 +#define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids, 1L + +#define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +#define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +#define NID_pbe_WithSHA1And40BitRC4 145 +#define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids, 2L + +#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 3L + +#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 4L + +#define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +#define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +#define NID_pbe_WithSHA1And128BitRC2_CBC 148 +#define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids, 5L + +#define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +#define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +#define NID_pbe_WithSHA1And40BitRC2_CBC 149 +#define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids, 6L + +#define OBJ_pkcs12_Version1 OBJ_pkcs12, 10L + +#define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1, 1L + +#define LN_keyBag "keyBag" +#define NID_keyBag 150 +#define OBJ_keyBag OBJ_pkcs12_BagIds, 1L + +#define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +#define NID_pkcs8ShroudedKeyBag 151 +#define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds, 2L + +#define LN_certBag "certBag" +#define NID_certBag 152 +#define OBJ_certBag OBJ_pkcs12_BagIds, 3L + +#define LN_crlBag "crlBag" +#define NID_crlBag 153 +#define OBJ_crlBag OBJ_pkcs12_BagIds, 4L + +#define LN_secretBag "secretBag" +#define NID_secretBag 154 +#define OBJ_secretBag OBJ_pkcs12_BagIds, 5L + +#define LN_safeContentsBag "safeContentsBag" +#define NID_safeContentsBag 155 +#define OBJ_safeContentsBag OBJ_pkcs12_BagIds, 6L + +#define LN_friendlyName "friendlyName" +#define NID_friendlyName 156 +#define OBJ_friendlyName OBJ_pkcs9, 20L + +#define LN_localKeyID "localKeyID" +#define NID_localKeyID 157 +#define OBJ_localKeyID OBJ_pkcs9, 21L + +#define OBJ_certTypes OBJ_pkcs9, 22L + +#define LN_x509Certificate "x509Certificate" +#define NID_x509Certificate 158 +#define OBJ_x509Certificate OBJ_certTypes, 1L + +#define LN_sdsiCertificate "sdsiCertificate" +#define NID_sdsiCertificate 159 +#define OBJ_sdsiCertificate OBJ_certTypes, 2L + +#define OBJ_crlTypes OBJ_pkcs9, 23L + +#define LN_x509Crl "x509Crl" +#define NID_x509Crl 160 +#define OBJ_x509Crl OBJ_crlTypes, 1L + +/* PKCS#5 v2 OIDs */ + +#define LN_pbes2 "PBES2" +#define NID_pbes2 161 +#define OBJ_pbes2 OBJ_pkcs,5L,13L + +#define LN_pbmac1 "PBMAC1" +#define NID_pbmac1 162 +#define OBJ_pbmac1 OBJ_pkcs,5L,14L + +#define LN_hmacWithSHA1 "hmacWithSHA1" +#define NID_hmacWithSHA1 163 +#define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +/* Policy Qualifier Ids */ + +#define LN_id_qt_cps "Policy Qualifier CPS" +#define SN_id_qt_cps "id-qt-cps" +#define NID_id_qt_cps 164 +#define OBJ_id_qt_cps OBJ_id_pkix,2L,1L + +#define LN_id_qt_unotice "Policy Qualifier User Notice" +#define SN_id_qt_unotice "id-qt-unotice" +#define NID_id_qt_unotice 165 +#define OBJ_id_qt_unotice OBJ_id_pkix,2L,2L + +#define SN_rc2_64_cbc "RC2-64-CBC" +#define LN_rc2_64_cbc "rc2-64-cbc" +#define NID_rc2_64_cbc 166 + +#define SN_SMIMECapabilities "SMIME-CAPS" +#define LN_SMIMECapabilities "S/MIME Capabilities" +#define NID_SMIMECapabilities 167 +#define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +#define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +#define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +#define NID_pbeWithMD2AndRC2_CBC 168 +#define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs,5L,4L + +#define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +#define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +#define NID_pbeWithMD5AndRC2_CBC 169 +#define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs,5L,6L + +#define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +#define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +#define NID_pbeWithSHA1AndDES_CBC 170 +#define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs,5L,10L + +/* Extension request OIDs */ + +#define LN_ms_ext_req "Microsoft Extension Request" +#define SN_ms_ext_req "msExtReq" +#define NID_ms_ext_req 171 +#define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +#define LN_ext_req "Extension Request" +#define SN_ext_req "extReq" +#define NID_ext_req 172 +#define OBJ_ext_req OBJ_pkcs9,14L + +#define SN_name "name" +#define LN_name "name" +#define NID_name 173 +#define OBJ_name OBJ_X509,41L + +#define SN_dnQualifier "dnQualifier" +#define LN_dnQualifier "dnQualifier" +#define NID_dnQualifier 174 +#define OBJ_dnQualifier OBJ_X509,46L + +#define SN_id_pe "id-pe" +#define NID_id_pe 175 +#define OBJ_id_pe OBJ_id_pkix,1L + +#define SN_id_ad "id-ad" +#define NID_id_ad 176 +#define OBJ_id_ad OBJ_id_pkix,48L + +#define SN_info_access "authorityInfoAccess" +#define LN_info_access "Authority Information Access" +#define NID_info_access 177 +#define OBJ_info_access OBJ_id_pe,1L + +#define SN_ad_OCSP "OCSP" +#define LN_ad_OCSP "OCSP" +#define NID_ad_OCSP 178 +#define OBJ_ad_OCSP OBJ_id_ad,1L + +#define SN_ad_ca_issuers "caIssuers" +#define LN_ad_ca_issuers "CA Issuers" +#define NID_ad_ca_issuers 179 +#define OBJ_ad_ca_issuers OBJ_id_ad,2L + +#define SN_OCSP_sign "OCSPSigning" +#define LN_OCSP_sign "OCSP Signing" +#define NID_OCSP_sign 180 +#define OBJ_OCSP_sign OBJ_id_kp,9L +#endif /* USE_OBJ_MAC */ + +#include +#include + +#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 + +#define OBJ_BSEARCH_VALUE_ON_NOMATCH 0x01 +#define OBJ_BSEARCH_FIRST_VALUE_ON_MATCH 0x02 + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct obj_name_st + { + int type; + int alias; + const char *name; + const char *data; + } OBJ_NAME; + +#define OBJ_create_and_add_object(a,b,c) OBJ_create(a,b,c) + + +int OBJ_NAME_init(void); +int OBJ_NAME_new_index(unsigned long (*hash_func)(const char *), + int (*cmp_func)(const char *, const char *), + void (*free_func)(const char *, int, const char *)); +const char *OBJ_NAME_get(const char *name,int type); +int OBJ_NAME_add(const char *name,int type,const char *data); +int OBJ_NAME_remove(const char *name,int type); +void OBJ_NAME_cleanup(int type); /* -1 for everything */ +void OBJ_NAME_do_all(int type,void (*fn)(const OBJ_NAME *,void *arg), + void *arg); +void OBJ_NAME_do_all_sorted(int type,void (*fn)(const OBJ_NAME *,void *arg), + void *arg); + +ASN1_OBJECT * OBJ_dup(const ASN1_OBJECT *o); +ASN1_OBJECT * OBJ_nid2obj(int n); +const char * OBJ_nid2ln(int n); +const char * OBJ_nid2sn(int n); +int OBJ_obj2nid(const ASN1_OBJECT *o); +ASN1_OBJECT * OBJ_txt2obj(const char *s, int no_name); +int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name); +int OBJ_txt2nid(const char *s); +int OBJ_ln2nid(const char *s); +int OBJ_sn2nid(const char *s); +int OBJ_cmp(const ASN1_OBJECT *a,const ASN1_OBJECT *b); +const char * OBJ_bsearch(const char *key,const char *base,int num,int size, + int (*cmp)(const void *, const void *)); +const char * OBJ_bsearch_ex(const char *key,const char *base,int num, + int size, int (*cmp)(const void *, const void *), int flags); + +int OBJ_new_nid(int num); +int OBJ_add_object(const ASN1_OBJECT *obj); +int OBJ_create(const char *oid,const char *sn,const char *ln); +void OBJ_cleanup(void ); +int OBJ_create_objects(BIO *in); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_OBJ_strings(void); + +/* Error codes for the OBJ functions. */ + +/* Function codes. */ +#define OBJ_F_OBJ_ADD_OBJECT 105 +#define OBJ_F_OBJ_CREATE 100 +#define OBJ_F_OBJ_DUP 101 +#define OBJ_F_OBJ_NAME_NEW_INDEX 106 +#define OBJ_F_OBJ_NID2LN 102 +#define OBJ_F_OBJ_NID2OBJ 103 +#define OBJ_F_OBJ_NID2SN 104 + +/* Reason codes. */ +#define OBJ_R_MALLOC_FAILURE 100 +#define OBJ_R_UNKNOWN_NID 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/ocsp.h b/mswin32/OpenSSL/include/openssl/ocsp.h new file mode 100755 index 000000000..8163411c9 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ocsp.h @@ -0,0 +1,614 @@ +/* ocsp.h */ +/* Written by Tom Titchener for the OpenSSL + * project. */ + +/* History: + This file was transfered to Richard Levitte from CertCo by Kathy + Weinhold in mid-spring 2000 to be included in OpenSSL or released + as a patch kit. */ + +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OCSP_H +#define HEADER_OCSP_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Various flags and values */ + +#define OCSP_DEFAULT_NONCE_LENGTH 16 + +#define OCSP_NOCERTS 0x1 +#define OCSP_NOINTERN 0x2 +#define OCSP_NOSIGS 0x4 +#define OCSP_NOCHAIN 0x8 +#define OCSP_NOVERIFY 0x10 +#define OCSP_NOEXPLICIT 0x20 +#define OCSP_NOCASIGN 0x40 +#define OCSP_NODELEGATED 0x80 +#define OCSP_NOCHECKS 0x100 +#define OCSP_TRUSTOTHER 0x200 +#define OCSP_RESPID_KEY 0x400 +#define OCSP_NOTIME 0x800 + +/* CertID ::= SEQUENCE { + * hashAlgorithm AlgorithmIdentifier, + * issuerNameHash OCTET STRING, -- Hash of Issuer's DN + * issuerKeyHash OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields) + * serialNumber CertificateSerialNumber } + */ +typedef struct ocsp_cert_id_st + { + X509_ALGOR *hashAlgorithm; + ASN1_OCTET_STRING *issuerNameHash; + ASN1_OCTET_STRING *issuerKeyHash; + ASN1_INTEGER *serialNumber; + } OCSP_CERTID; + +DECLARE_STACK_OF(OCSP_CERTID) + +/* Request ::= SEQUENCE { + * reqCert CertID, + * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_one_request_st + { + OCSP_CERTID *reqCert; + STACK_OF(X509_EXTENSION) *singleRequestExtensions; + } OCSP_ONEREQ; + +DECLARE_STACK_OF(OCSP_ONEREQ) +DECLARE_ASN1_SET_OF(OCSP_ONEREQ) + + +/* TBSRequest ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * requestorName [1] EXPLICIT GeneralName OPTIONAL, + * requestList SEQUENCE OF Request, + * requestExtensions [2] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_req_info_st + { + ASN1_INTEGER *version; + GENERAL_NAME *requestorName; + STACK_OF(OCSP_ONEREQ) *requestList; + STACK_OF(X509_EXTENSION) *requestExtensions; + } OCSP_REQINFO; + +/* Signature ::= SEQUENCE { + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ +typedef struct ocsp_signature_st + { + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; + } OCSP_SIGNATURE; + +/* OCSPRequest ::= SEQUENCE { + * tbsRequest TBSRequest, + * optionalSignature [0] EXPLICIT Signature OPTIONAL } + */ +typedef struct ocsp_request_st + { + OCSP_REQINFO *tbsRequest; + OCSP_SIGNATURE *optionalSignature; /* OPTIONAL */ + } OCSP_REQUEST; + +/* OCSPResponseStatus ::= ENUMERATED { + * successful (0), --Response has valid confirmations + * malformedRequest (1), --Illegal confirmation request + * internalError (2), --Internal error in issuer + * tryLater (3), --Try again later + * --(4) is not used + * sigRequired (5), --Must sign the request + * unauthorized (6) --Request unauthorized + * } + */ +#define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 +#define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 +#define OCSP_RESPONSE_STATUS_INTERNALERROR 2 +#define OCSP_RESPONSE_STATUS_TRYLATER 3 +#define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 +#define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 + +/* ResponseBytes ::= SEQUENCE { + * responseType OBJECT IDENTIFIER, + * response OCTET STRING } + */ +typedef struct ocsp_resp_bytes_st + { + ASN1_OBJECT *responseType; + ASN1_OCTET_STRING *response; + } OCSP_RESPBYTES; + +/* OCSPResponse ::= SEQUENCE { + * responseStatus OCSPResponseStatus, + * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL } + */ +typedef struct ocsp_response_st + { + ASN1_ENUMERATED *responseStatus; + OCSP_RESPBYTES *responseBytes; + } OCSP_RESPONSE; + +/* ResponderID ::= CHOICE { + * byName [1] Name, + * byKey [2] KeyHash } + */ +#define V_OCSP_RESPID_NAME 0 +#define V_OCSP_RESPID_KEY 1 +typedef struct ocsp_responder_id_st + { + int type; + union { + X509_NAME* byName; + ASN1_OCTET_STRING *byKey; + } value; + } OCSP_RESPID; +/* KeyHash ::= OCTET STRING --SHA-1 hash of responder's public key + * --(excluding the tag and length fields) + */ + +/* RevokedInfo ::= SEQUENCE { + * revocationTime GeneralizedTime, + * revocationReason [0] EXPLICIT CRLReason OPTIONAL } + */ +typedef struct ocsp_revoked_info_st + { + ASN1_GENERALIZEDTIME *revocationTime; + ASN1_ENUMERATED *revocationReason; + } OCSP_REVOKEDINFO; + +/* CertStatus ::= CHOICE { + * good [0] IMPLICIT NULL, + * revoked [1] IMPLICIT RevokedInfo, + * unknown [2] IMPLICIT UnknownInfo } + */ +#define V_OCSP_CERTSTATUS_GOOD 0 +#define V_OCSP_CERTSTATUS_REVOKED 1 +#define V_OCSP_CERTSTATUS_UNKNOWN 2 +typedef struct ocsp_cert_status_st + { + int type; + union { + ASN1_NULL *good; + OCSP_REVOKEDINFO *revoked; + ASN1_NULL *unknown; + } value; + } OCSP_CERTSTATUS; + +/* SingleResponse ::= SEQUENCE { + * certID CertID, + * certStatus CertStatus, + * thisUpdate GeneralizedTime, + * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL, + * singleExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_single_response_st + { + OCSP_CERTID *certId; + OCSP_CERTSTATUS *certStatus; + ASN1_GENERALIZEDTIME *thisUpdate; + ASN1_GENERALIZEDTIME *nextUpdate; + STACK_OF(X509_EXTENSION) *singleExtensions; + } OCSP_SINGLERESP; + +DECLARE_STACK_OF(OCSP_SINGLERESP) +DECLARE_ASN1_SET_OF(OCSP_SINGLERESP) + +/* ResponseData ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * responderID ResponderID, + * producedAt GeneralizedTime, + * responses SEQUENCE OF SingleResponse, + * responseExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_response_data_st + { + ASN1_INTEGER *version; + OCSP_RESPID *responderId; + ASN1_GENERALIZEDTIME *producedAt; + STACK_OF(OCSP_SINGLERESP) *responses; + STACK_OF(X509_EXTENSION) *responseExtensions; + } OCSP_RESPDATA; + +/* BasicOCSPResponse ::= SEQUENCE { + * tbsResponseData ResponseData, + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ + /* Note 1: + The value for "signature" is specified in the OCSP rfc2560 as follows: + "The value for the signature SHALL be computed on the hash of the DER + encoding ResponseData." This means that you must hash the DER-encoded + tbsResponseData, and then run it through a crypto-signing function, which + will (at least w/RSA) do a hash-'n'-private-encrypt operation. This seems + a bit odd, but that's the spec. Also note that the data structures do not + leave anywhere to independently specify the algorithm used for the initial + hash. So, we look at the signature-specification algorithm, and try to do + something intelligent. -- Kathy Weinhold, CertCo */ + /* Note 2: + It seems that the mentioned passage from RFC 2560 (section 4.2.1) is open + for interpretation. I've done tests against another responder, and found + that it doesn't do the double hashing that the RFC seems to say one + should. Therefore, all relevant functions take a flag saying which + variant should be used. -- Richard Levitte, OpenSSL team and CeloCom */ +typedef struct ocsp_basic_response_st + { + OCSP_RESPDATA *tbsResponseData; + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; + } OCSP_BASICRESP; + +/* + * CRLReason ::= ENUMERATED { + * unspecified (0), + * keyCompromise (1), + * cACompromise (2), + * affiliationChanged (3), + * superseded (4), + * cessationOfOperation (5), + * certificateHold (6), + * removeFromCRL (8) } + */ +#define OCSP_REVOKED_STATUS_NOSTATUS -1 +#define OCSP_REVOKED_STATUS_UNSPECIFIED 0 +#define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 +#define OCSP_REVOKED_STATUS_CACOMPROMISE 2 +#define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 +#define OCSP_REVOKED_STATUS_SUPERSEDED 4 +#define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 +#define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 +#define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 + +/* CrlID ::= SEQUENCE { + * crlUrl [0] EXPLICIT IA5String OPTIONAL, + * crlNum [1] EXPLICIT INTEGER OPTIONAL, + * crlTime [2] EXPLICIT GeneralizedTime OPTIONAL } + */ +typedef struct ocsp_crl_id_st + { + ASN1_IA5STRING *crlUrl; + ASN1_INTEGER *crlNum; + ASN1_GENERALIZEDTIME *crlTime; + } OCSP_CRLID; + +/* ServiceLocator ::= SEQUENCE { + * issuer Name, + * locator AuthorityInfoAccessSyntax OPTIONAL } + */ +typedef struct ocsp_service_locator_st + { + X509_NAME* issuer; + STACK_OF(ACCESS_DESCRIPTION) *locator; + } OCSP_SERVICELOC; + +#define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" +#define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" + +#define d2i_OCSP_REQUEST_bio(bp,p) ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p) + +#define d2i_OCSP_RESPONSE_bio(bp,p) ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p) + +#define PEM_read_bio_OCSP_REQUEST(bp,x,cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,bp,(char **)x,cb,NULL) + +#define PEM_read_bio_OCSP_RESPONSE(bp,x,cb)(OCSP_RESPONSE *)PEM_ASN1_read_bio(\ + (char *(*)())d2i_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,bp,(char **)x,cb,NULL) + +#define PEM_write_bio_OCSP_REQUEST(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +#define PEM_write_bio_OCSP_RESPONSE(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +#define i2d_OCSP_RESPONSE_bio(bp,o) ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o) + +#define i2d_OCSP_REQUEST_bio(bp,o) ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o) + +#define OCSP_REQUEST_sign(o,pkey,md) \ + ASN1_item_sign(ASN1_ITEM_rptr(OCSP_REQINFO),\ + o->optionalSignature->signatureAlgorithm,NULL,\ + o->optionalSignature->signature,o->tbsRequest,pkey,md) + +#define OCSP_BASICRESP_sign(o,pkey,md,d) \ + ASN1_item_sign(ASN1_ITEM_rptr(OCSP_RESPDATA),o->signatureAlgorithm,NULL,\ + o->signature,o->tbsResponseData,pkey,md) + +#define OCSP_REQUEST_verify(a,r) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_REQINFO),\ + a->optionalSignature->signatureAlgorithm,\ + a->optionalSignature->signature,a->tbsRequest,r) + +#define OCSP_BASICRESP_verify(a,r,d) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_RESPDATA),\ + a->signatureAlgorithm,a->signature,a->tbsResponseData,r) + +#define ASN1_BIT_STRING_digest(data,type,md,len) \ + ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) + +#define OCSP_CERTID_dup(cid) ASN1_dup_of(OCSP_CERTID,i2d_OCSP_CERTID,d2i_OCSP_CERTID,cid) + +#define OCSP_CERTSTATUS_dup(cs)\ + (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\ + (char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs)) + +OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req); + +OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer); + +OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, + X509_NAME *issuerName, + ASN1_BIT_STRING* issuerKey, + ASN1_INTEGER *serialNumber); + +OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); + +int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); +int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); +int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); +int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); + +int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm); +int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); + +int OCSP_request_sign(OCSP_REQUEST *req, + X509 *signer, + EVP_PKEY *key, + const EVP_MD *dgst, + STACK_OF(X509) *certs, + unsigned long flags); + +int OCSP_response_status(OCSP_RESPONSE *resp); +OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); + +int OCSP_resp_count(OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); +int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); +int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, + int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, + ASN1_GENERALIZEDTIME *nextupd, + long sec, long maxsec); + +int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, X509_STORE *store, unsigned long flags); + +int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pssl); + +int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b); +int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b); + +int OCSP_request_onereq_count(OCSP_REQUEST *req); +OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); +OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); +int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, + ASN1_OCTET_STRING **pikeyHash, + ASN1_INTEGER **pserial, OCSP_CERTID *cid); +int OCSP_request_is_signed(OCSP_REQUEST *req); +OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, + OCSP_CERTID *cid, + int status, int reason, + ASN1_TIME *revtime, + ASN1_TIME *thisupd, ASN1_TIME *nextupd); +int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); +int OCSP_basic_sign(OCSP_BASICRESP *brsp, + X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +ASN1_STRING *ASN1_STRING_encode(ASN1_STRING *s, i2d_of_void *i2d, + void *data, STACK_OF(ASN1_OBJECT) *sk); +#define ASN1_STRING_encode_of(type,s,i2d,data,sk) \ + ASN1_STRING_encode(s, CHECKED_I2D_OF(type, i2d), data, sk) + +X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim); + +X509_EXTENSION *OCSP_accept_responses_new(char **oids); + +X509_EXTENSION *OCSP_archive_cutoff_new(char* tim); + +X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME* issuer, char **urls); + +int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); +int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); +int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, int lastpos); +int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos); +X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); +X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); +void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, int *idx); +int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); + +int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); +int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); +int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos); +int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); +X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); +X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); +void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); +int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); + +int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); +int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); +int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, int lastpos); +int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, int lastpos); +X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); +X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); +void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, int *idx); +int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); + +int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); +int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos); +int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, int lastpos); +int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, int lastpos); +X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); +X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); +void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, int *idx); +int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); + +DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) +DECLARE_ASN1_FUNCTIONS(OCSP_REVOKEDINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_BASICRESP) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPDATA) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPONSE) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPBYTES) +DECLARE_ASN1_FUNCTIONS(OCSP_ONEREQ) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTID) +DECLARE_ASN1_FUNCTIONS(OCSP_REQUEST) +DECLARE_ASN1_FUNCTIONS(OCSP_SIGNATURE) +DECLARE_ASN1_FUNCTIONS(OCSP_REQINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_CRLID) +DECLARE_ASN1_FUNCTIONS(OCSP_SERVICELOC) + +char *OCSP_response_status_str(long s); +char *OCSP_cert_status_str(long s); +char *OCSP_crl_reason_str(long s); + +int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* a, unsigned long flags); +int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags); + +int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, + X509_STORE *st, unsigned long flags); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_OCSP_strings(void); + +/* Error codes for the OCSP functions. */ + +/* Function codes. */ +#define OCSP_F_ASN1_STRING_ENCODE 100 +#define OCSP_F_D2I_OCSP_NONCE 102 +#define OCSP_F_OCSP_BASIC_ADD1_STATUS 103 +#define OCSP_F_OCSP_BASIC_SIGN 104 +#define OCSP_F_OCSP_BASIC_VERIFY 105 +#define OCSP_F_OCSP_CERT_ID_NEW 101 +#define OCSP_F_OCSP_CHECK_DELEGATED 106 +#define OCSP_F_OCSP_CHECK_IDS 107 +#define OCSP_F_OCSP_CHECK_ISSUER 108 +#define OCSP_F_OCSP_CHECK_VALIDITY 115 +#define OCSP_F_OCSP_MATCH_ISSUERID 109 +#define OCSP_F_OCSP_PARSE_URL 114 +#define OCSP_F_OCSP_REQUEST_SIGN 110 +#define OCSP_F_OCSP_REQUEST_VERIFY 116 +#define OCSP_F_OCSP_RESPONSE_GET1_BASIC 111 +#define OCSP_F_OCSP_SENDREQ_BIO 112 +#define OCSP_F_REQUEST_VERIFY 113 + +/* Reason codes. */ +#define OCSP_R_BAD_DATA 100 +#define OCSP_R_CERTIFICATE_VERIFY_ERROR 101 +#define OCSP_R_DIGEST_ERR 102 +#define OCSP_R_ERROR_IN_NEXTUPDATE_FIELD 122 +#define OCSP_R_ERROR_IN_THISUPDATE_FIELD 123 +#define OCSP_R_ERROR_PARSING_URL 121 +#define OCSP_R_MISSING_OCSPSIGNING_USAGE 103 +#define OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE 124 +#define OCSP_R_NOT_BASIC_RESPONSE 104 +#define OCSP_R_NO_CERTIFICATES_IN_CHAIN 105 +#define OCSP_R_NO_CONTENT 106 +#define OCSP_R_NO_PUBLIC_KEY 107 +#define OCSP_R_NO_RESPONSE_DATA 108 +#define OCSP_R_NO_REVOKED_TIME 109 +#define OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 110 +#define OCSP_R_REQUEST_NOT_SIGNED 128 +#define OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA 111 +#define OCSP_R_ROOT_CA_NOT_TRUSTED 112 +#define OCSP_R_SERVER_READ_ERROR 113 +#define OCSP_R_SERVER_RESPONSE_ERROR 114 +#define OCSP_R_SERVER_RESPONSE_PARSE_ERROR 115 +#define OCSP_R_SERVER_WRITE_ERROR 116 +#define OCSP_R_SIGNATURE_FAILURE 117 +#define OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND 118 +#define OCSP_R_STATUS_EXPIRED 125 +#define OCSP_R_STATUS_NOT_YET_VALID 126 +#define OCSP_R_STATUS_TOO_OLD 127 +#define OCSP_R_UNKNOWN_MESSAGE_DIGEST 119 +#define OCSP_R_UNKNOWN_NID 120 +#define OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE 129 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/opensslconf.h b/mswin32/OpenSSL/include/openssl/opensslconf.h new file mode 100755 index 000000000..91b23a7df --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/opensslconf.h @@ -0,0 +1,230 @@ +/* opensslconf.h */ +/* WARNING: Generated automatically from opensslconf.h.in by Configure. */ + +/* OpenSSL was configured with the following options: */ +#ifndef OPENSSL_SYSNAME_WIN32 +# define OPENSSL_SYSNAME_WIN32 +#endif +#ifndef OPENSSL_DOING_MAKEDEPEND + +#ifndef OPENSSL_NO_CAMELLIA +# define OPENSSL_NO_CAMELLIA +#endif +#ifndef OPENSSL_NO_GMP +# define OPENSSL_NO_GMP +#endif +#ifndef OPENSSL_NO_KRB5 +# define OPENSSL_NO_KRB5 +#endif +#ifndef OPENSSL_NO_MDC2 +# define OPENSSL_NO_MDC2 +#endif +#ifndef OPENSSL_NO_RC5 +# define OPENSSL_NO_RC5 +#endif +#ifndef OPENSSL_NO_RFC3779 +# define OPENSSL_NO_RFC3779 +#endif +#ifndef OPENSSL_NO_SEED +# define OPENSSL_NO_SEED +#endif +#ifndef OPENSSL_NO_TLSEXT +# define OPENSSL_NO_TLSEXT +#endif + +#endif /* OPENSSL_DOING_MAKEDEPEND */ +#ifndef OPENSSL_THREADS +# define OPENSSL_THREADS +#endif + +/* The OPENSSL_NO_* macros are also defined as NO_* if the application + asks for it. This is a transient feature that is provided for those + who haven't had the time to do the appropriate changes in their + applications. */ +#ifdef OPENSSL_ALGORITHM_DEFINES +# if defined(OPENSSL_NO_CAMELLIA) && !defined(NO_CAMELLIA) +# define NO_CAMELLIA +# endif +# if defined(OPENSSL_NO_GMP) && !defined(NO_GMP) +# define NO_GMP +# endif +# if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5) +# define NO_KRB5 +# endif +# if defined(OPENSSL_NO_MDC2) && !defined(NO_MDC2) +# define NO_MDC2 +# endif +# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5) +# define NO_RC5 +# endif +# if defined(OPENSSL_NO_RFC3779) && !defined(NO_RFC3779) +# define NO_RFC3779 +# endif +# if defined(OPENSSL_NO_SEED) && !defined(NO_SEED) +# define NO_SEED +# endif +# if defined(OPENSSL_NO_TLSEXT) && !defined(NO_TLSEXT) +# define NO_TLSEXT +# endif +#endif + +/* crypto/opensslconf.h.in */ + +/* Generate 80386 code? */ +#undef I386_ONLY + +#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */ +#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#define ENGINESDIR "C:/OpenSSL/lib/engines" +#define OPENSSLDIR "C:/OpenSSL/ssl" +#endif +#endif + +#undef OPENSSL_UNISTD +#define OPENSSL_UNISTD + +#undef OPENSSL_EXPORT_VAR_AS_FUNCTION +#define OPENSSL_EXPORT_VAR_AS_FUNCTION + +#if defined(HEADER_IDEA_H) && !defined(IDEA_INT) +#define IDEA_INT unsigned int +#endif + +#if defined(HEADER_MD2_H) && !defined(MD2_INT) +#define MD2_INT unsigned int +#endif + +#if defined(HEADER_RC2_H) && !defined(RC2_INT) +/* I need to put in a mod for the alpha - eay */ +#define RC2_INT unsigned int +#endif + +#if defined(HEADER_RC4_H) +#if !defined(RC4_INT) +/* using int types make the structure larger but make the code faster + * on most boxes I have tested - up to %20 faster. */ +/* + * I don't know what does "most" mean, but declaring "int" is a must on: + * - Intel P6 because partial register stalls are very expensive; + * - elder Alpha because it lacks byte load/store instructions; + */ +#define RC4_INT unsigned int +#endif +#if !defined(RC4_CHUNK) +/* + * This enables code handling data aligned at natural CPU word + * boundary. See crypto/rc4/rc4_enc.c for further details. + */ +#undef RC4_CHUNK +#endif +#endif + +#if (defined(HEADER_NEW_DES_H) || defined(HEADER_DES_H)) && !defined(DES_LONG) +/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a + * %20 speed up (longs are 8 bytes, int's are 4). */ +#ifndef DES_LONG +#define DES_LONG unsigned long +#endif +#endif + +#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) +#define CONFIG_HEADER_BN_H +#define BN_LLONG + +/* Should we define BN_DIV2W here? */ + +/* Only one for the following should be defined */ +/* The prime number generation stuff may not work when + * EIGHT_BIT but I don't care since I've only used this mode + * for debuging the bignum libraries */ +#undef SIXTY_FOUR_BIT_LONG +#undef SIXTY_FOUR_BIT +#define THIRTY_TWO_BIT +#undef SIXTEEN_BIT +#undef EIGHT_BIT +#endif + +#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H) +#define CONFIG_HEADER_RC4_LOCL_H +/* if this is defined data[i] is used instead of *data, this is a %20 + * speedup on x86 */ +#define RC4_INDEX +#endif + +#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) +#define CONFIG_HEADER_BF_LOCL_H +#undef BF_PTR +#endif /* HEADER_BF_LOCL_H */ + +#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H) +#define CONFIG_HEADER_DES_LOCL_H +#ifndef DES_DEFAULT_OPTIONS +/* the following is tweaked from a config script, that is why it is a + * protected undef/define */ +#ifndef DES_PTR +#undef DES_PTR +#endif + +/* This helps C compiler generate the correct code for multiple functional + * units. It reduces register dependancies at the expense of 2 more + * registers */ +#ifndef DES_RISC1 +#undef DES_RISC1 +#endif + +#ifndef DES_RISC2 +#undef DES_RISC2 +#endif + +#if defined(DES_RISC1) && defined(DES_RISC2) +YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!! +#endif + +/* Unroll the inner loop, this sometimes helps, sometimes hinders. + * Very mucy CPU dependant */ +#ifndef DES_UNROLL +#undef DES_UNROLL +#endif + +/* These default values were supplied by + * Peter Gutman + * They are only used if nothing else has been defined */ +#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL) +/* Special defines which change the way the code is built depending on the + CPU and OS. For SGI machines you can use _MIPS_SZLONG (32 or 64) to find + even newer MIPS CPU's, but at the moment one size fits all for + optimization options. Older Sparc's work better with only UNROLL, but + 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 +#elif defined( __ultrix ) /* Older MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined( __osf1__ ) /* Alpha */ +# define DES_PTR +# define DES_RISC2 +#elif defined ( _AIX ) /* RS6000 */ + /* Unknown */ +#elif defined( __hpux ) /* HP-PA */ + /* Unknown */ +#elif defined( __aux ) /* 68K */ + /* Unknown */ +#elif defined( __dgux ) /* 88K (but P6 in latest boxes) */ +# define DES_UNROLL +#elif defined( __sgi ) /* Newer MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined(i386) || defined(__i386__) /* x86 boxes, should be gcc */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#endif /* Systems-specific speed defines */ +#endif + +#endif /* DES_DEFAULT_OPTIONS */ +#endif /* HEADER_DES_LOCL_H */ diff --git a/mswin32/OpenSSL/include/openssl/opensslv.h b/mswin32/OpenSSL/include/openssl/opensslv.h new file mode 100755 index 000000000..f76910a6f --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/opensslv.h @@ -0,0 +1,89 @@ +#ifndef HEADER_OPENSSLV_H +#define HEADER_OPENSSLV_H + +/* Numeric release version identifier: + * MNNFFPPS: major minor fix patch status + * The status nibble has one of the values 0 for development, 1 to e for betas + * 1 to 14, and f for release. The patch level is exactly that. + * For example: + * 0.9.3-dev 0x00903000 + * 0.9.3-beta1 0x00903001 + * 0.9.3-beta2-dev 0x00903002 + * 0.9.3-beta2 0x00903002 (same as ...beta2-dev) + * 0.9.3 0x0090300f + * 0.9.3a 0x0090301f + * 0.9.4 0x0090400f + * 1.2.3z 0x102031af + * + * For continuity reasons (because 0.9.5 is already out, and is coded + * 0x00905100), between 0.9.5 and 0.9.6 the coding of the patch level + * part is slightly different, by setting the highest bit. This means + * that 0.9.5a looks like this: 0x0090581f. At 0.9.6, we can start + * with 0x0090600S... + * + * (Prior to 0.9.3-dev a different scheme was used: 0.9.2b is 0x0922.) + * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for + * major minor fix final patch/beta) + */ +#define OPENSSL_VERSION_NUMBER 0x0090807fL +#ifdef OPENSSL_FIPS +#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8g-fips 19 Oct 2007" +#else +#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8g 19 Oct 2007" +#endif +#define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT + + +/* The macros below are to be used for shared library (.so, .dll, ...) + * versioning. That kind of versioning works a bit differently between + * operating systems. The most usual scheme is to set a major and a minor + * number, and have the runtime loader check that the major number is equal + * to what it was at application link time, while the minor number has to + * be greater or equal to what it was at application link time. With this + * scheme, the version number is usually part of the file name, like this: + * + * libcrypto.so.0.9 + * + * Some unixen also make a softlink with the major verson number only: + * + * libcrypto.so.0 + * + * On Tru64 and IRIX 6.x it works a little bit differently. There, the + * shared library version is stored in the file, and is actually a series + * of versions, separated by colons. The rightmost version present in the + * library when linking an application is stored in the application to be + * matched at run time. When the application is run, a check is done to + * see if the library version stored in the application matches any of the + * versions in the version string of the library itself. + * This version string can be constructed in any way, depending on what + * kind of matching is desired. However, to implement the same scheme as + * the one used in the other unixen, all compatible versions, from lowest + * to highest, should be part of the string. Consecutive builds would + * give the following versions strings: + * + * 3.0 + * 3.0:3.1 + * 3.0:3.1:3.2 + * 4.0 + * 4.0:4.1 + * + * Notice how version 4 is completely incompatible with version, and + * therefore give the breach you can see. + * + * There may be other schemes as well that I haven't yet discovered. + * + * So, here's the way it works here: first of all, the library version + * number doesn't need at all to match the overall OpenSSL version. + * However, it's nice and more understandable if it actually does. + * The current library version is stored in the macro SHLIB_VERSION_NUMBER, + * which is just a piece of text in the format "M.m.e" (Major, minor, edit). + * For the sake of Tru64, IRIX, and any other OS that behaves in similar ways, + * we need to keep a history of version numbers, which is done in the + * macro SHLIB_VERSION_HISTORY. The numbers are separated by colons and + * should only keep the versions that are binary compatible with the current. + */ +#define SHLIB_VERSION_HISTORY "" +#define SHLIB_VERSION_NUMBER "0.9.8" + + +#endif /* HEADER_OPENSSLV_H */ diff --git a/mswin32/OpenSSL/include/openssl/ossl_typ.h b/mswin32/OpenSSL/include/openssl/ossl_typ.h new file mode 100755 index 000000000..9c335a181 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ossl_typ.h @@ -0,0 +1,174 @@ +/* ==================================================================== + * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OPENSSL_TYPES_H +#define HEADER_OPENSSL_TYPES_H + +#include + +#ifdef NO_ASN1_TYPEDEFS +#define ASN1_INTEGER ASN1_STRING +#define ASN1_ENUMERATED 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_TIME ASN1_STRING +#define ASN1_GENERALSTRING ASN1_STRING +#define ASN1_UNIVERSALSTRING ASN1_STRING +#define ASN1_BMPSTRING ASN1_STRING +#define ASN1_VISIBLESTRING ASN1_STRING +#define ASN1_UTF8STRING ASN1_STRING +#define ASN1_BOOLEAN int +#define ASN1_NULL int +#else +typedef struct asn1_string_st ASN1_INTEGER; +typedef struct asn1_string_st ASN1_ENUMERATED; +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_TIME; +typedef struct asn1_string_st ASN1_GENERALIZEDTIME; +typedef struct asn1_string_st ASN1_VISIBLESTRING; +typedef struct asn1_string_st ASN1_UTF8STRING; +typedef int ASN1_BOOLEAN; +typedef int ASN1_NULL; +#endif + +#ifdef OPENSSL_SYS_WIN32 +#undef X509_NAME +#undef X509_CERT_PAIR +#undef PKCS7_ISSUER_AND_SERIAL +#endif + +#ifdef BIGNUM +#undef BIGNUM +#endif +typedef struct bignum_st BIGNUM; +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; + +typedef struct buf_mem_st BUF_MEM; + +typedef struct evp_cipher_st EVP_CIPHER; +typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX; +typedef struct env_md_st EVP_MD; +typedef struct env_md_ctx_st EVP_MD_CTX; +typedef struct evp_pkey_st EVP_PKEY; + +typedef struct dh_st DH; +typedef struct dh_method DH_METHOD; + +typedef struct dsa_st DSA; +typedef struct dsa_method DSA_METHOD; + +typedef struct rsa_st RSA; +typedef struct rsa_meth_st RSA_METHOD; + +typedef struct rand_meth_st RAND_METHOD; + +typedef struct ecdh_method ECDH_METHOD; +typedef struct ecdsa_method ECDSA_METHOD; + +typedef struct x509_st X509; +typedef struct X509_algor_st X509_ALGOR; +typedef struct X509_crl_st X509_CRL; +typedef struct X509_name_st X509_NAME; +typedef struct x509_store_st X509_STORE; +typedef struct x509_store_ctx_st X509_STORE_CTX; + +typedef struct v3_ext_ctx X509V3_CTX; +typedef struct conf_st CONF; + +typedef struct store_st STORE; +typedef struct store_method_st STORE_METHOD; + +typedef struct ui_st UI; +typedef struct ui_method_st UI_METHOD; + +typedef struct st_ERR_FNS ERR_FNS; + +typedef struct engine_st ENGINE; + +typedef struct X509_POLICY_NODE_st X509_POLICY_NODE; +typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL; +typedef struct X509_POLICY_TREE_st X509_POLICY_TREE; +typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE; + + /* If placed in pkcs12.h, we end up with a circular depency with pkcs7.h */ +#define DECLARE_PKCS12_STACK_OF(type) /* Nothing */ +#define IMPLEMENT_PKCS12_STACK_OF(type) /* Nothing */ + +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; +/* Callback types for crypto.h */ +typedef int CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, void *from_d, + int idx, long argl, void *argp); + +#endif /* def HEADER_OPENSSL_TYPES_H */ diff --git a/mswin32/OpenSSL/include/openssl/pem.h b/mswin32/OpenSSL/include/openssl/pem.h new file mode 100755 index 000000000..4e24cc5b5 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/pem.h @@ -0,0 +1,776 @@ +/* crypto/pem/pem.h */ +/* 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.] + */ + +#ifndef HEADER_PEM_H +#define HEADER_PEM_H + +#include +#ifndef OPENSSL_NO_BIO +#include +#endif +#ifndef OPENSSL_NO_STACK +#include +#endif +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define PEM_BUFSIZE 1024 + +#define PEM_OBJ_UNDEF 0 +#define PEM_OBJ_X509 1 +#define PEM_OBJ_X509_REQ 2 +#define PEM_OBJ_CRL 3 +#define PEM_OBJ_SSL_SESSION 4 +#define PEM_OBJ_PRIV_KEY 10 +#define PEM_OBJ_PRIV_RSA 11 +#define PEM_OBJ_PRIV_DSA 12 +#define PEM_OBJ_PRIV_DH 13 +#define PEM_OBJ_PUB_RSA 14 +#define PEM_OBJ_PUB_DSA 15 +#define PEM_OBJ_PUB_DH 16 +#define PEM_OBJ_DHPARAMS 17 +#define PEM_OBJ_DSAPARAMS 18 +#define PEM_OBJ_PRIV_RSA_PUBLIC 19 +#define PEM_OBJ_PRIV_ECDSA 20 +#define PEM_OBJ_PUB_ECDSA 21 +#define PEM_OBJ_ECPARAMETERS 22 + +#define PEM_ERROR 30 +#define PEM_DEK_DES_CBC 40 +#define PEM_DEK_IDEA_CBC 45 +#define PEM_DEK_DES_EDE 50 +#define PEM_DEK_DES_ECB 60 +#define PEM_DEK_RSA 70 +#define PEM_DEK_RSA_MD2 80 +#define PEM_DEK_RSA_MD5 90 + +#define PEM_MD_MD2 NID_md2 +#define PEM_MD_MD5 NID_md5 +#define PEM_MD_SHA NID_sha +#define PEM_MD_MD2_RSA NID_md2WithRSAEncryption +#define PEM_MD_MD5_RSA NID_md5WithRSAEncryption +#define PEM_MD_SHA_RSA NID_sha1WithRSAEncryption + +#define PEM_STRING_X509_OLD "X509 CERTIFICATE" +#define PEM_STRING_X509 "CERTIFICATE" +#define PEM_STRING_X509_PAIR "CERTIFICATE PAIR" +#define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" +#define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" +#define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" +#define PEM_STRING_X509_CRL "X509 CRL" +#define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" +#define PEM_STRING_PUBLIC "PUBLIC KEY" +#define PEM_STRING_RSA "RSA PRIVATE KEY" +#define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" +#define PEM_STRING_DSA "DSA PRIVATE KEY" +#define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" +#define PEM_STRING_PKCS7 "PKCS7" +#define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" +#define PEM_STRING_PKCS8INF "PRIVATE KEY" +#define PEM_STRING_DHPARAMS "DH PARAMETERS" +#define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" +#define PEM_STRING_DSAPARAMS "DSA PARAMETERS" +#define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" +#define PEM_STRING_ECPARAMETERS "EC PARAMETERS" +#define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" + + /* Note that this structure is initialised by PEM_SealInit and cleaned up + by PEM_SealFinal (at least for now) */ +typedef struct PEM_Encode_Seal_st + { + EVP_ENCODE_CTX encode; + EVP_MD_CTX md; + EVP_CIPHER_CTX cipher; + } PEM_ENCODE_SEAL_CTX; + +/* enc_type is one off */ +#define PEM_TYPE_ENCRYPTED 10 +#define PEM_TYPE_MIC_ONLY 20 +#define PEM_TYPE_MIC_CLEAR 30 +#define PEM_TYPE_CLEAR 40 + +typedef struct pem_recip_st + { + char *name; + X509_NAME *dn; + + int cipher; + int key_enc; + /* char iv[8]; unused and wrong size */ + } PEM_USER; + +typedef struct pem_ctx_st + { + int type; /* what type of object */ + + struct { + int version; + int mode; + } proc_type; + + char *domain; + + struct { + int cipher; + /* unused, and wrong size + unsigned char iv[8]; */ + } DEK_info; + + PEM_USER *originator; + + int num_recipient; + PEM_USER **recipient; + +#ifndef OPENSSL_NO_STACK + STACK *x509_chain; /* certificate chain */ +#else + char *x509_chain; /* certificate chain */ +#endif + EVP_MD *md; /* signature type */ + + int md_enc; /* is the md encrypted or not? */ + int md_len; /* length of md_data */ + char *md_data; /* message digest, could be pkey encrypted */ + + EVP_CIPHER *dec; /* date encryption cipher */ + int key_len; /* key length */ + unsigned char *key; /* key */ + /* unused, and wrong size + unsigned char iv[8]; */ + + + int data_enc; /* is the data encrypted */ + int data_len; + unsigned char *data; + } PEM_CTX; + +/* These macros make the PEM_read/PEM_write functions easier to maintain and + * write. Now they are all implemented with either: + * IMPLEMENT_PEM_rw(...) or IMPLEMENT_PEM_rw_cb(...) + */ + +#ifdef OPENSSL_NO_FP_API + +#define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ +#define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ +#define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ + +#else + +#define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ +type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ +{ \ + return (type*)PEM_ASN1_read(CHECKED_D2I_OF(type, d2i_##asn1), \ + str, fp, \ + CHECKED_PPTR_OF(type, x), \ + cb, u); \ +} + +#define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x) \ +{ \ + return PEM_ASN1_write(CHECKED_I2D_OF(type, i2d_##asn1), \ + str, fp, \ + CHECKED_PTR_OF(type, x), \ + NULL, NULL, 0, NULL, NULL); \ +} + +#define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, const type *x) \ +{ \ + return PEM_ASN1_write(CHECKED_I2D_OF(const type, i2d_##asn1), \ + str, fp, \ + CHECKED_PTR_OF(const type, x), \ + NULL, NULL, 0, NULL, NULL); \ +} + +#define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write(CHECKED_I2D_OF(type, i2d_##asn1), \ + str, fp, \ + CHECKED_PTR_OF(type, x), \ + enc, kstr, klen, cb, u); \ + } + +#define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write(CHECKED_I2D_OF(const type, i2d_##asn1), \ + str, fp, \ + CHECKED_PTR_OF(const type, x), \ + enc, kstr, klen, cb, u); \ + } + +#endif + +#define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ +type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ +{ \ + return (type*)PEM_ASN1_read_bio(CHECKED_D2I_OF(type, d2i_##asn1), \ + str, bp, \ + CHECKED_PPTR_OF(type, x), \ + cb, u); \ +} + +#define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x) \ +{ \ + return PEM_ASN1_write_bio(CHECKED_I2D_OF(type, i2d_##asn1), \ + str, bp, \ + CHECKED_PTR_OF(type, x), \ + NULL, NULL, 0, NULL, NULL); \ +} + +#define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, const type *x) \ +{ \ + return PEM_ASN1_write_bio(CHECKED_I2D_OF(const type, i2d_##asn1), \ + str, bp, \ + CHECKED_PTR_OF(const type, x), \ + NULL, NULL, 0, NULL, NULL); \ +} + +#define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio(CHECKED_I2D_OF(type, i2d_##asn1), \ + str, bp, \ + CHECKED_PTR_OF(type, x), \ + enc, kstr, klen, cb, u); \ + } + +#define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio(CHECKED_I2D_OF(const type, i2d_##asn1), \ + str, bp, \ + CHECKED_PTR_OF(const type, x), \ + enc, kstr, klen, cb, u); \ + } + +#define IMPLEMENT_PEM_write(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp(name, type, str, asn1) + +#define IMPLEMENT_PEM_write_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) + +#define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) + +#define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) + +#define IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_read_fp(name, type, str, asn1) + +#define IMPLEMENT_PEM_rw(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write(name, type, str, asn1) + +#define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_const(name, type, str, asn1) + +#define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb(name, type, str, asn1) + +/* These are the same except they are for the declarations */ + +#if defined(OPENSSL_SYS_WIN16) || defined(OPENSSL_NO_FP_API) + +#define DECLARE_PEM_read_fp(name, type) /**/ +#define DECLARE_PEM_write_fp(name, type) /**/ +#define DECLARE_PEM_write_cb_fp(name, type) /**/ + +#else + +#define DECLARE_PEM_read_fp(name, type) \ + type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u); + +#define DECLARE_PEM_write_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x); + +#define DECLARE_PEM_write_fp_const(name, type) \ + int PEM_write_##name(FILE *fp, const type *x); + +#define DECLARE_PEM_write_cb_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + +#endif + +#ifndef OPENSSL_NO_BIO +#define DECLARE_PEM_read_bio(name, type) \ + type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u); + +#define DECLARE_PEM_write_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x); + +#define DECLARE_PEM_write_bio_const(name, type) \ + int PEM_write_bio_##name(BIO *bp, const type *x); + +#define DECLARE_PEM_write_cb_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + +#else + +#define DECLARE_PEM_read_bio(name, type) /**/ +#define DECLARE_PEM_write_bio(name, type) /**/ +#define DECLARE_PEM_write_cb_bio(name, type) /**/ + +#endif + +#define DECLARE_PEM_write(name, type) \ + DECLARE_PEM_write_bio(name, type) \ + DECLARE_PEM_write_fp(name, type) + +#define DECLARE_PEM_write_const(name, type) \ + DECLARE_PEM_write_bio_const(name, type) \ + DECLARE_PEM_write_fp_const(name, type) + +#define DECLARE_PEM_write_cb(name, type) \ + DECLARE_PEM_write_cb_bio(name, type) \ + DECLARE_PEM_write_cb_fp(name, type) + +#define DECLARE_PEM_read(name, type) \ + DECLARE_PEM_read_bio(name, type) \ + DECLARE_PEM_read_fp(name, type) + +#define DECLARE_PEM_rw(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write(name, type) + +#define DECLARE_PEM_rw_const(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_const(name, type) + +#define DECLARE_PEM_rw_cb(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_cb(name, type) + +#ifdef SSLEAY_MACROS + +#define PEM_write_SSL_SESSION(fp,x) \ + PEM_ASN1_write((int (*)())i2d_SSL_SESSION, \ + PEM_STRING_SSL_SESSION,fp, (char *)x, NULL,NULL,0,NULL,NULL) +#define PEM_write_X509(fp,x) \ + PEM_ASN1_write((int (*)())i2d_X509,PEM_STRING_X509,fp, \ + (char *)x, NULL,NULL,0,NULL,NULL) +#define PEM_write_X509_REQ(fp,x) PEM_ASN1_write( \ + (int (*)())i2d_X509_REQ,PEM_STRING_X509_REQ,fp,(char *)x, \ + NULL,NULL,0,NULL,NULL) +#define PEM_write_X509_CRL(fp,x) \ + PEM_ASN1_write((int (*)())i2d_X509_CRL,PEM_STRING_X509_CRL, \ + fp,(char *)x, NULL,NULL,0,NULL,NULL) +#define PEM_write_RSAPrivateKey(fp,x,enc,kstr,klen,cb,u) \ + PEM_ASN1_write((int (*)())i2d_RSAPrivateKey,PEM_STRING_RSA,fp,\ + (char *)x,enc,kstr,klen,cb,u) +#define PEM_write_RSAPublicKey(fp,x) \ + PEM_ASN1_write((int (*)())i2d_RSAPublicKey,\ + PEM_STRING_RSA_PUBLIC,fp,(char *)x,NULL,NULL,0,NULL,NULL) +#define PEM_write_DSAPrivateKey(fp,x,enc,kstr,klen,cb,u) \ + PEM_ASN1_write((int (*)())i2d_DSAPrivateKey,PEM_STRING_DSA,fp,\ + (char *)x,enc,kstr,klen,cb,u) +#define PEM_write_PrivateKey(bp,x,enc,kstr,klen,cb,u) \ + PEM_ASN1_write((int (*)())i2d_PrivateKey,\ + (((x)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA),\ + bp,(char *)x,enc,kstr,klen,cb,u) +#define PEM_write_PKCS7(fp,x) \ + PEM_ASN1_write((int (*)())i2d_PKCS7,PEM_STRING_PKCS7,fp, \ + (char *)x, NULL,NULL,0,NULL,NULL) +#define PEM_write_DHparams(fp,x) \ + PEM_ASN1_write((int (*)())i2d_DHparams,PEM_STRING_DHPARAMS,fp,\ + (char *)x,NULL,NULL,0,NULL,NULL) + +#define PEM_write_NETSCAPE_CERT_SEQUENCE(fp,x) \ + PEM_ASN1_write((int (*)())i2d_NETSCAPE_CERT_SEQUENCE, \ + PEM_STRING_X509,fp, \ + (char *)x, NULL,NULL,0,NULL,NULL) + +#define PEM_read_SSL_SESSION(fp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read( \ + (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,fp,(char **)x,cb,u) +#define PEM_read_X509(fp,x,cb,u) (X509 *)PEM_ASN1_read( \ + (char *(*)())d2i_X509,PEM_STRING_X509,fp,(char **)x,cb,u) +#define PEM_read_X509_REQ(fp,x,cb,u) (X509_REQ *)PEM_ASN1_read( \ + (char *(*)())d2i_X509_REQ,PEM_STRING_X509_REQ,fp,(char **)x,cb,u) +#define PEM_read_X509_CRL(fp,x,cb,u) (X509_CRL *)PEM_ASN1_read( \ + (char *(*)())d2i_X509_CRL,PEM_STRING_X509_CRL,fp,(char **)x,cb,u) +#define PEM_read_RSAPrivateKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \ + (char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,fp,(char **)x,cb,u) +#define PEM_read_RSAPublicKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \ + (char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,fp,(char **)x,cb,u) +#define PEM_read_DSAPrivateKey(fp,x,cb,u) (DSA *)PEM_ASN1_read( \ + (char *(*)())d2i_DSAPrivateKey,PEM_STRING_DSA,fp,(char **)x,cb,u) +#define PEM_read_PrivateKey(fp,x,cb,u) (EVP_PKEY *)PEM_ASN1_read( \ + (char *(*)())d2i_PrivateKey,PEM_STRING_EVP_PKEY,fp,(char **)x,cb,u) +#define PEM_read_PKCS7(fp,x,cb,u) (PKCS7 *)PEM_ASN1_read( \ + (char *(*)())d2i_PKCS7,PEM_STRING_PKCS7,fp,(char **)x,cb,u) +#define PEM_read_DHparams(fp,x,cb,u) (DH *)PEM_ASN1_read( \ + (char *(*)())d2i_DHparams,PEM_STRING_DHPARAMS,fp,(char **)x,cb,u) + +#define PEM_read_NETSCAPE_CERT_SEQUENCE(fp,x,cb,u) \ + (NETSCAPE_CERT_SEQUENCE *)PEM_ASN1_read( \ + (char *(*)())d2i_NETSCAPE_CERT_SEQUENCE,PEM_STRING_X509,fp,\ + (char **)x,cb,u) + +#define PEM_write_bio_X509(bp,x) \ + PEM_ASN1_write_bio((int (*)())i2d_X509,PEM_STRING_X509,bp, \ + (char *)x, NULL,NULL,0,NULL,NULL) +#define PEM_write_bio_X509_REQ(bp,x) PEM_ASN1_write_bio( \ + (int (*)())i2d_X509_REQ,PEM_STRING_X509_REQ,bp,(char *)x, \ + NULL,NULL,0,NULL,NULL) +#define PEM_write_bio_X509_CRL(bp,x) \ + PEM_ASN1_write_bio((int (*)())i2d_X509_CRL,PEM_STRING_X509_CRL,\ + bp,(char *)x, NULL,NULL,0,NULL,NULL) +#define PEM_write_bio_RSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \ + PEM_ASN1_write_bio((int (*)())i2d_RSAPrivateKey,PEM_STRING_RSA,\ + bp,(char *)x,enc,kstr,klen,cb,u) +#define PEM_write_bio_RSAPublicKey(bp,x) \ + PEM_ASN1_write_bio((int (*)())i2d_RSAPublicKey, \ + PEM_STRING_RSA_PUBLIC,\ + bp,(char *)x,NULL,NULL,0,NULL,NULL) +#define PEM_write_bio_DSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \ + PEM_ASN1_write_bio((int (*)())i2d_DSAPrivateKey,PEM_STRING_DSA,\ + bp,(char *)x,enc,kstr,klen,cb,u) +#define PEM_write_bio_PrivateKey(bp,x,enc,kstr,klen,cb,u) \ + PEM_ASN1_write_bio((int (*)())i2d_PrivateKey,\ + (((x)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA),\ + bp,(char *)x,enc,kstr,klen,cb,u) +#define PEM_write_bio_PKCS7(bp,x) \ + PEM_ASN1_write_bio((int (*)())i2d_PKCS7,PEM_STRING_PKCS7,bp, \ + (char *)x, NULL,NULL,0,NULL,NULL) +#define PEM_write_bio_DHparams(bp,x) \ + PEM_ASN1_write_bio((int (*)())i2d_DHparams,PEM_STRING_DHPARAMS,\ + bp,(char *)x,NULL,NULL,0,NULL,NULL) +#define PEM_write_bio_DSAparams(bp,x) \ + PEM_ASN1_write_bio((int (*)())i2d_DSAparams, \ + PEM_STRING_DSAPARAMS,bp,(char *)x,NULL,NULL,0,NULL,NULL) + +#define PEM_write_bio_NETSCAPE_CERT_SEQUENCE(bp,x) \ + PEM_ASN1_write_bio((int (*)())i2d_NETSCAPE_CERT_SEQUENCE, \ + PEM_STRING_X509,bp, \ + (char *)x, NULL,NULL,0,NULL,NULL) + +#define PEM_read_bio_X509(bp,x,cb,u) (X509 *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_X509,PEM_STRING_X509,bp,(char **)x,cb,u) +#define PEM_read_bio_X509_REQ(bp,x,cb,u) (X509_REQ *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_X509_REQ,PEM_STRING_X509_REQ,bp,(char **)x,cb,u) +#define PEM_read_bio_X509_CRL(bp,x,cb,u) (X509_CRL *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_X509_CRL,PEM_STRING_X509_CRL,bp,(char **)x,cb,u) +#define PEM_read_bio_RSAPrivateKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,bp,(char **)x,cb,u) +#define PEM_read_bio_RSAPublicKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,bp,(char **)x,cb,u) +#define PEM_read_bio_DSAPrivateKey(bp,x,cb,u) (DSA *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_DSAPrivateKey,PEM_STRING_DSA,bp,(char **)x,cb,u) +#define PEM_read_bio_PrivateKey(bp,x,cb,u) (EVP_PKEY *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_PrivateKey,PEM_STRING_EVP_PKEY,bp,(char **)x,cb,u) + +#define PEM_read_bio_PKCS7(bp,x,cb,u) (PKCS7 *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_PKCS7,PEM_STRING_PKCS7,bp,(char **)x,cb,u) +#define PEM_read_bio_DHparams(bp,x,cb,u) (DH *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_DHparams,PEM_STRING_DHPARAMS,bp,(char **)x,cb,u) +#define PEM_read_bio_DSAparams(bp,x,cb,u) (DSA *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_DSAparams,PEM_STRING_DSAPARAMS,bp,(char **)x,cb,u) + +#define PEM_read_bio_NETSCAPE_CERT_SEQUENCE(bp,x,cb,u) \ + (NETSCAPE_CERT_SEQUENCE *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_NETSCAPE_CERT_SEQUENCE,PEM_STRING_X509,bp,\ + (char **)x,cb,u) + +#endif + +#if 1 +/* "userdata": new with OpenSSL 0.9.4 */ +typedef int pem_password_cb(char *buf, int size, int rwflag, void *userdata); +#else +/* OpenSSL 0.9.3, 0.9.3a */ +typedef int pem_password_cb(char *buf, int size, int rwflag); +#endif + +int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); +int PEM_do_header (EVP_CIPHER_INFO *cipher, unsigned char *data,long *len, + pem_password_cb *callback,void *u); + +#ifndef OPENSSL_NO_BIO +int PEM_read_bio(BIO *bp, char **name, char **header, + unsigned char **data,long *len); +int PEM_write_bio(BIO *bp,const char *name,char *hdr,unsigned char *data, + long len); +int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, const char *name, BIO *bp, + pem_password_cb *cb, void *u); +void * PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, + void **x, pem_password_cb *cb, void *u); + +#define PEM_ASN1_read_bio_of(type,d2i,name,bp,x,cb,u) \ + ((type*)PEM_ASN1_read_bio(CHECKED_D2I_OF(type, d2i), \ + name, bp, \ + CHECKED_PPTR_OF(type, x), \ + cb, u)) + +int PEM_ASN1_write_bio(i2d_of_void *i2d,const char *name,BIO *bp,char *x, + const EVP_CIPHER *enc,unsigned char *kstr,int klen, + pem_password_cb *cb, void *u); + +#define PEM_ASN1_write_bio_of(type,i2d,name,bp,x,enc,kstr,klen,cb,u) \ + (PEM_ASN1_write_bio(CHECKED_I2D_OF(type, i2d), \ + name, bp, \ + CHECKED_PTR_OF(type, x), \ + enc, kstr, klen, cb, u)) + +STACK_OF(X509_INFO) * PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u); +int PEM_X509_INFO_write_bio(BIO *bp,X509_INFO *xi, EVP_CIPHER *enc, + unsigned char *kstr, int klen, pem_password_cb *cd, void *u); +#endif + +#ifndef OPENSSL_SYS_WIN16 +int PEM_read(FILE *fp, char **name, char **header, + unsigned char **data,long *len); +int PEM_write(FILE *fp,char *name,char *hdr,unsigned char *data,long len); +void * PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write(i2d_of_void *i2d,const char *name,FILE *fp, + char *x,const EVP_CIPHER *enc,unsigned char *kstr, + int klen,pem_password_cb *callback, void *u); +STACK_OF(X509_INFO) * PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); +#endif + +int PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type, + EVP_MD *md_type, unsigned char **ek, int *ekl, + unsigned char *iv, EVP_PKEY **pubk, int npubk); +void PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl, + unsigned char *in, int inl); +int PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig,int *sigl, + unsigned char *out, int *outl, EVP_PKEY *priv); + +void PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); +void PEM_SignUpdate(EVP_MD_CTX *ctx,unsigned char *d,unsigned int cnt); +int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, + unsigned int *siglen, EVP_PKEY *pkey); + +int PEM_def_callback(char *buf, int num, int w, void *key); +void PEM_proc_type(char *buf, int type); +void PEM_dek_info(char *buf, const char *type, int len, char *str); + +#ifndef SSLEAY_MACROS + +#include + +DECLARE_PEM_rw(X509, X509) + +DECLARE_PEM_rw(X509_AUX, X509) + +DECLARE_PEM_rw(X509_CERT_PAIR, X509_CERT_PAIR) + +DECLARE_PEM_rw(X509_REQ, X509_REQ) +DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) + +DECLARE_PEM_rw(X509_CRL, X509_CRL) + +DECLARE_PEM_rw(PKCS7, PKCS7) + +DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) + +DECLARE_PEM_rw(PKCS8, X509_SIG) + +DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) + +#ifndef OPENSSL_NO_RSA + +DECLARE_PEM_rw_cb(RSAPrivateKey, RSA) + +DECLARE_PEM_rw_const(RSAPublicKey, RSA) +DECLARE_PEM_rw(RSA_PUBKEY, RSA) + +#endif + +#ifndef OPENSSL_NO_DSA + +DECLARE_PEM_rw_cb(DSAPrivateKey, DSA) + +DECLARE_PEM_rw(DSA_PUBKEY, DSA) + +DECLARE_PEM_rw_const(DSAparams, DSA) + +#endif + +#ifndef OPENSSL_NO_EC +DECLARE_PEM_rw_const(ECPKParameters, EC_GROUP) +DECLARE_PEM_rw_cb(ECPrivateKey, EC_KEY) +DECLARE_PEM_rw(EC_PUBKEY, EC_KEY) +#endif + +#ifndef OPENSSL_NO_DH + +DECLARE_PEM_rw_const(DHparams, DH) + +#endif + +DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) + +DECLARE_PEM_rw(PUBKEY, EVP_PKEY) + +int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, + char *, int, pem_password_cb *, void *); +int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u); + +int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); + +EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u); + +int PEM_write_PKCS8PrivateKey(FILE *fp,EVP_PKEY *x,const EVP_CIPHER *enc, + char *kstr,int klen, pem_password_cb *cd, void *u); + +#endif /* SSLEAY_MACROS */ + + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PEM_strings(void); + +/* Error codes for the PEM functions. */ + +/* Function codes. */ +#define PEM_F_D2I_PKCS8PRIVATEKEY_BIO 120 +#define PEM_F_D2I_PKCS8PRIVATEKEY_FP 121 +#define PEM_F_DO_PK8PKEY 126 +#define PEM_F_DO_PK8PKEY_FP 125 +#define PEM_F_LOAD_IV 101 +#define PEM_F_PEM_ASN1_READ 102 +#define PEM_F_PEM_ASN1_READ_BIO 103 +#define PEM_F_PEM_ASN1_WRITE 104 +#define PEM_F_PEM_ASN1_WRITE_BIO 105 +#define PEM_F_PEM_DEF_CALLBACK 100 +#define PEM_F_PEM_DO_HEADER 106 +#define PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY 118 +#define PEM_F_PEM_GET_EVP_CIPHER_INFO 107 +#define PEM_F_PEM_PK8PKEY 119 +#define PEM_F_PEM_READ 108 +#define PEM_F_PEM_READ_BIO 109 +#define PEM_F_PEM_READ_BIO_PRIVATEKEY 123 +#define PEM_F_PEM_READ_PRIVATEKEY 124 +#define PEM_F_PEM_SEALFINAL 110 +#define PEM_F_PEM_SEALINIT 111 +#define PEM_F_PEM_SIGNFINAL 112 +#define PEM_F_PEM_WRITE 113 +#define PEM_F_PEM_WRITE_BIO 114 +#define PEM_F_PEM_X509_INFO_READ 115 +#define PEM_F_PEM_X509_INFO_READ_BIO 116 +#define PEM_F_PEM_X509_INFO_WRITE_BIO 117 + +/* Reason codes. */ +#define PEM_R_BAD_BASE64_DECODE 100 +#define PEM_R_BAD_DECRYPT 101 +#define PEM_R_BAD_END_LINE 102 +#define PEM_R_BAD_IV_CHARS 103 +#define PEM_R_BAD_PASSWORD_READ 104 +#define PEM_R_ERROR_CONVERTING_PRIVATE_KEY 115 +#define PEM_R_NOT_DEK_INFO 105 +#define PEM_R_NOT_ENCRYPTED 106 +#define PEM_R_NOT_PROC_TYPE 107 +#define PEM_R_NO_START_LINE 108 +#define PEM_R_PROBLEMS_GETTING_PASSWORD 109 +#define PEM_R_PUBLIC_KEY_NO_RSA 110 +#define PEM_R_READ_KEY 111 +#define PEM_R_SHORT_HEADER 112 +#define PEM_R_UNSUPPORTED_CIPHER 113 +#define PEM_R_UNSUPPORTED_ENCRYPTION 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/pem2.h b/mswin32/OpenSSL/include/openssl/pem2.h new file mode 100755 index 000000000..f31790d69 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/pem2.h @@ -0,0 +1,70 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* + * This header only exists to break a circular dependency between pem and err + * Ben 30 Jan 1999. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef HEADER_PEM_H +void ERR_load_PEM_strings(void); +#endif + +#ifdef __cplusplus +} +#endif diff --git a/mswin32/OpenSSL/include/openssl/pkcs12.h b/mswin32/OpenSSL/include/openssl/pkcs12.h new file mode 100755 index 000000000..a2d7e359a --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/pkcs12.h @@ -0,0 +1,333 @@ +/* pkcs12.h */ +/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL + * project 1999. + */ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PKCS12_H +#define HEADER_PKCS12_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define PKCS12_KEY_ID 1 +#define PKCS12_IV_ID 2 +#define PKCS12_MAC_ID 3 + +/* Default iteration count */ +#ifndef PKCS12_DEFAULT_ITER +#define PKCS12_DEFAULT_ITER PKCS5_DEFAULT_ITER +#endif + +#define PKCS12_MAC_KEY_LENGTH 20 + +#define PKCS12_SALT_LEN 8 + +/* Uncomment out next line for unicode password and names, otherwise ASCII */ + +/*#define PBE_UNICODE*/ + +#ifdef PBE_UNICODE +#define PKCS12_key_gen PKCS12_key_gen_uni +#define PKCS12_add_friendlyname PKCS12_add_friendlyname_uni +#else +#define PKCS12_key_gen PKCS12_key_gen_asc +#define PKCS12_add_friendlyname PKCS12_add_friendlyname_asc +#endif + +/* MS key usage constants */ + +#define KEY_EX 0x10 +#define KEY_SIG 0x80 + +typedef struct { +X509_SIG *dinfo; +ASN1_OCTET_STRING *salt; +ASN1_INTEGER *iter; /* defaults to 1 */ +} PKCS12_MAC_DATA; + +typedef struct { +ASN1_INTEGER *version; +PKCS12_MAC_DATA *mac; +PKCS7 *authsafes; +} PKCS12; + +PREDECLARE_STACK_OF(PKCS12_SAFEBAG) + +typedef struct { +ASN1_OBJECT *type; +union { + struct pkcs12_bag_st *bag; /* secret, crl and certbag */ + struct pkcs8_priv_key_info_st *keybag; /* keybag */ + X509_SIG *shkeybag; /* shrouded key bag */ + STACK_OF(PKCS12_SAFEBAG) *safes; + ASN1_TYPE *other; +}value; +STACK_OF(X509_ATTRIBUTE) *attrib; +} PKCS12_SAFEBAG; + +DECLARE_STACK_OF(PKCS12_SAFEBAG) +DECLARE_ASN1_SET_OF(PKCS12_SAFEBAG) +DECLARE_PKCS12_STACK_OF(PKCS12_SAFEBAG) + +typedef struct pkcs12_bag_st { +ASN1_OBJECT *type; +union { + ASN1_OCTET_STRING *x509cert; + ASN1_OCTET_STRING *x509crl; + ASN1_OCTET_STRING *octet; + ASN1_IA5STRING *sdsicert; + ASN1_TYPE *other; /* Secret or other bag */ +}value; +} PKCS12_BAGS; + +#define PKCS12_ERROR 0 +#define PKCS12_OK 1 + +/* Compatibility macros */ + +#define M_PKCS12_x5092certbag PKCS12_x5092certbag +#define M_PKCS12_x509crl2certbag PKCS12_x509crl2certbag + +#define M_PKCS12_certbag2x509 PKCS12_certbag2x509 +#define M_PKCS12_certbag2x509crl PKCS12_certbag2x509crl + +#define M_PKCS12_unpack_p7data PKCS12_unpack_p7data +#define M_PKCS12_pack_authsafes PKCS12_pack_authsafes +#define M_PKCS12_unpack_authsafes PKCS12_unpack_authsafes +#define M_PKCS12_unpack_p7encdata PKCS12_unpack_p7encdata + +#define M_PKCS12_decrypt_skey PKCS12_decrypt_skey +#define M_PKCS8_decrypt PKCS8_decrypt + +#define M_PKCS12_bag_type(bg) OBJ_obj2nid((bg)->type) +#define M_PKCS12_cert_bag_type(bg) OBJ_obj2nid((bg)->value.bag->type) +#define M_PKCS12_crl_bag_type M_PKCS12_cert_bag_type + +#define PKCS12_get_attr(bag, attr_nid) \ + PKCS12_get_attr_gen(bag->attrib, attr_nid) + +#define PKCS8_get_attr(p8, attr_nid) \ + PKCS12_get_attr_gen(p8->attributes, attr_nid) + +#define PKCS12_mac_present(p12) ((p12)->mac ? 1 : 0) + + +PKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509); +PKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl); +X509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag); +X509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag); + +PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, int nid1, + int nid2); +PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(X509_SIG *p8, const char *pass, int passlen); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(PKCS12_SAFEBAG *bag, const char *pass, + int passlen); +X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8); +PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass, + int passlen, unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8); +PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7); +PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + STACK_OF(PKCS12_SAFEBAG) *bags); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, int passlen); + +int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes); +STACK_OF(PKCS7) *PKCS12_unpack_authsafes(PKCS12 *p12); + +int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, int namelen); +int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, const unsigned char *name, + int namelen); +int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage); +ASN1_TYPE *PKCS12_get_attr_gen(STACK_OF(X509_ATTRIBUTE) *attrs, int attr_nid); +char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag); +unsigned char *PKCS12_pbe_crypt(X509_ALGOR *algor, const char *pass, + int passlen, unsigned char *in, int inlen, + unsigned char **data, int *datalen, int en_de); +void * PKCS12_item_decrypt_d2i(X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, ASN1_OCTET_STRING *oct, int zbuf); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + void *obj, int zbuf); +PKCS12 *PKCS12_init(int mode); +int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, int saltlen, int id, int iter, int n, unsigned char *out, const EVP_MD *md_type); +int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md_type, + int en_de); +int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *mac, unsigned int *maclen); +int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen); +int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + const EVP_MD *md_type); +int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, + int saltlen, const EVP_MD *md_type); +unsigned char *asc2uni(const char *asc, int asclen, unsigned char **uni, int *unilen); +char *uni2asc(unsigned char *uni, int unilen); + +DECLARE_ASN1_FUNCTIONS(PKCS12) +DECLARE_ASN1_FUNCTIONS(PKCS12_MAC_DATA) +DECLARE_ASN1_FUNCTIONS(PKCS12_SAFEBAG) +DECLARE_ASN1_FUNCTIONS(PKCS12_BAGS) + +DECLARE_ASN1_ITEM(PKCS12_SAFEBAGS) +DECLARE_ASN1_ITEM(PKCS12_AUTHSAFES) + +void PKCS12_PBE_add(void); +int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, + STACK_OF(X509) **ca); +PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, + STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, + int mac_iter, int keytype); + +PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert); +PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, EVP_PKEY *key, + int key_usage, int iter, + int key_nid, char *pass); +int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, char *pass); +PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid); + +int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12); +int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12); +PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12); +PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); +int PKCS12_newpass(PKCS12 *p12, char *oldpass, char *newpass); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PKCS12_strings(void); + +/* Error codes for the PKCS12 functions. */ + +/* Function codes. */ +#define PKCS12_F_PARSE_BAG 129 +#define PKCS12_F_PARSE_BAGS 103 +#define PKCS12_F_PKCS12_ADD_FRIENDLYNAME 100 +#define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_ASC 127 +#define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_UNI 102 +#define PKCS12_F_PKCS12_ADD_LOCALKEYID 104 +#define PKCS12_F_PKCS12_CREATE 105 +#define PKCS12_F_PKCS12_GEN_MAC 107 +#define PKCS12_F_PKCS12_INIT 109 +#define PKCS12_F_PKCS12_ITEM_DECRYPT_D2I 106 +#define PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT 108 +#define PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG 117 +#define PKCS12_F_PKCS12_KEY_GEN_ASC 110 +#define PKCS12_F_PKCS12_KEY_GEN_UNI 111 +#define PKCS12_F_PKCS12_MAKE_KEYBAG 112 +#define PKCS12_F_PKCS12_MAKE_SHKEYBAG 113 +#define PKCS12_F_PKCS12_NEWPASS 128 +#define PKCS12_F_PKCS12_PACK_P7DATA 114 +#define PKCS12_F_PKCS12_PACK_P7ENCDATA 115 +#define PKCS12_F_PKCS12_PARSE 118 +#define PKCS12_F_PKCS12_PBE_CRYPT 119 +#define PKCS12_F_PKCS12_PBE_KEYIVGEN 120 +#define PKCS12_F_PKCS12_SETUP_MAC 122 +#define PKCS12_F_PKCS12_SET_MAC 123 +#define PKCS12_F_PKCS12_UNPACK_AUTHSAFES 130 +#define PKCS12_F_PKCS12_UNPACK_P7DATA 131 +#define PKCS12_F_PKCS12_VERIFY_MAC 126 +#define PKCS12_F_PKCS8_ADD_KEYUSAGE 124 +#define PKCS12_F_PKCS8_ENCRYPT 125 + +/* Reason codes. */ +#define PKCS12_R_CANT_PACK_STRUCTURE 100 +#define PKCS12_R_CONTENT_TYPE_NOT_DATA 121 +#define PKCS12_R_DECODE_ERROR 101 +#define PKCS12_R_ENCODE_ERROR 102 +#define PKCS12_R_ENCRYPT_ERROR 103 +#define PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE 120 +#define PKCS12_R_INVALID_NULL_ARGUMENT 104 +#define PKCS12_R_INVALID_NULL_PKCS12_POINTER 105 +#define PKCS12_R_IV_GEN_ERROR 106 +#define PKCS12_R_KEY_GEN_ERROR 107 +#define PKCS12_R_MAC_ABSENT 108 +#define PKCS12_R_MAC_GENERATION_ERROR 109 +#define PKCS12_R_MAC_SETUP_ERROR 110 +#define PKCS12_R_MAC_STRING_SET_ERROR 111 +#define PKCS12_R_MAC_VERIFY_ERROR 112 +#define PKCS12_R_MAC_VERIFY_FAILURE 113 +#define PKCS12_R_PARSE_ERROR 114 +#define PKCS12_R_PKCS12_ALGOR_CIPHERINIT_ERROR 115 +#define PKCS12_R_PKCS12_CIPHERFINAL_ERROR 116 +#define PKCS12_R_PKCS12_PBE_CRYPT_ERROR 117 +#define PKCS12_R_UNKNOWN_DIGEST_ALGORITHM 118 +#define PKCS12_R_UNSUPPORTED_PKCS12_MODE 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/pkcs7.h b/mswin32/OpenSSL/include/openssl/pkcs7.h new file mode 100755 index 000000000..cc092d262 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/pkcs7.h @@ -0,0 +1,464 @@ +/* crypto/pkcs7/pkcs7.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.] + */ + +#ifndef HEADER_PKCS7_H +#define HEADER_PKCS7_H + +#include +#include +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_SYS_WIN32 +/* Under Win32 thes are defined in wincrypt.h */ +#undef PKCS7_ISSUER_AND_SERIAL +#undef PKCS7_SIGNER_INFO +#endif + +/* +Encryption_ID DES-CBC +Digest_ID MD5 +Digest_Encryption_ID rsaEncryption +Key_Encryption_ID rsaEncryption +*/ + +typedef struct pkcs7_issuer_and_serial_st + { + X509_NAME *issuer; + ASN1_INTEGER *serial; + } PKCS7_ISSUER_AND_SERIAL; + +typedef struct pkcs7_signer_info_st + { + ASN1_INTEGER *version; /* version 1 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *digest_alg; + STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */ + X509_ALGOR *digest_enc_alg; + ASN1_OCTET_STRING *enc_digest; + STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */ + + /* The private key to sign with */ + EVP_PKEY *pkey; + } PKCS7_SIGNER_INFO; + +DECLARE_STACK_OF(PKCS7_SIGNER_INFO) +DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO) + +typedef struct pkcs7_recip_info_st + { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *key_enc_algor; + ASN1_OCTET_STRING *enc_key; + X509 *cert; /* get the pub-key from this */ + } PKCS7_RECIP_INFO; + +DECLARE_STACK_OF(PKCS7_RECIP_INFO) +DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO) + +typedef struct pkcs7_signed_st + { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + + struct pkcs7_st *contents; + } PKCS7_SIGNED; +/* The above structure is very very similar to PKCS7_SIGN_ENVELOPE. + * How about merging the two */ + +typedef struct pkcs7_enc_content_st + { + ASN1_OBJECT *content_type; + X509_ALGOR *algorithm; + ASN1_OCTET_STRING *enc_data; /* [ 0 ] */ + const EVP_CIPHER *cipher; + } PKCS7_ENC_CONTENT; + +typedef struct pkcs7_enveloped_st + { + ASN1_INTEGER *version; /* version 0 */ + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; + PKCS7_ENC_CONTENT *enc_data; + } PKCS7_ENVELOPE; + +typedef struct pkcs7_signedandenveloped_st + { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + + PKCS7_ENC_CONTENT *enc_data; + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; + } PKCS7_SIGN_ENVELOPE; + +typedef struct pkcs7_digest_st + { + ASN1_INTEGER *version; /* version 0 */ + X509_ALGOR *md; /* md used */ + struct pkcs7_st *contents; + ASN1_OCTET_STRING *digest; + } PKCS7_DIGEST; + +typedef struct pkcs7_encrypted_st + { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ENC_CONTENT *enc_data; + } PKCS7_ENCRYPT; + +typedef struct pkcs7_st + { + /* The following is non NULL if it contains ASN1 encoding of + * this structure */ + unsigned char *asn1; + long length; + +#define PKCS7_S_HEADER 0 +#define PKCS7_S_BODY 1 +#define PKCS7_S_TAIL 2 + int state; /* used during processing */ + + int detached; + + ASN1_OBJECT *type; + /* content as defined by the type */ + /* all encryption/message digests are applied to the 'contents', + * leaving out the 'type' field. */ + union { + char *ptr; + + /* NID_pkcs7_data */ + ASN1_OCTET_STRING *data; + + /* NID_pkcs7_signed */ + PKCS7_SIGNED *sign; + + /* NID_pkcs7_enveloped */ + PKCS7_ENVELOPE *enveloped; + + /* NID_pkcs7_signedAndEnveloped */ + PKCS7_SIGN_ENVELOPE *signed_and_enveloped; + + /* NID_pkcs7_digest */ + PKCS7_DIGEST *digest; + + /* NID_pkcs7_encrypted */ + PKCS7_ENCRYPT *encrypted; + + /* Anything else */ + ASN1_TYPE *other; + } d; + } PKCS7; + +DECLARE_STACK_OF(PKCS7) +DECLARE_ASN1_SET_OF(PKCS7) +DECLARE_PKCS12_STACK_OF(PKCS7) + +#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_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) +#define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) +#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_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) + +#define PKCS7_set_detached(p,v) \ + PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL) +#define PKCS7_get_detached(p) \ + PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL) + +#define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) + +#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 + +/* S/MIME related flags */ + +#define PKCS7_TEXT 0x1 +#define PKCS7_NOCERTS 0x2 +#define PKCS7_NOSIGS 0x4 +#define PKCS7_NOCHAIN 0x8 +#define PKCS7_NOINTERN 0x10 +#define PKCS7_NOVERIFY 0x20 +#define PKCS7_DETACHED 0x40 +#define PKCS7_BINARY 0x80 +#define PKCS7_NOATTR 0x100 +#define PKCS7_NOSMIMECAP 0x200 +#define PKCS7_NOOLDMIMETYPE 0x400 +#define PKCS7_CRLFEOL 0x800 +#define PKCS7_STREAM 0x1000 +#define PKCS7_NOCRL 0x2000 + +/* Flags: for compatibility with older code */ + +#define SMIME_TEXT PKCS7_TEXT +#define SMIME_NOCERTS PKCS7_NOCERTS +#define SMIME_NOSIGS PKCS7_NOSIGS +#define SMIME_NOCHAIN PKCS7_NOCHAIN +#define SMIME_NOINTERN PKCS7_NOINTERN +#define SMIME_NOVERIFY PKCS7_NOVERIFY +#define SMIME_DETACHED PKCS7_DETACHED +#define SMIME_BINARY PKCS7_BINARY +#define SMIME_NOATTR PKCS7_NOATTR + +DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL) + +#ifndef SSLEAY_MACROS +int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data,const EVP_MD *type, + unsigned char *md,unsigned int *len); +#ifndef OPENSSL_NO_FP_API +PKCS7 *d2i_PKCS7_fp(FILE *fp,PKCS7 **p7); +int i2d_PKCS7_fp(FILE *fp,PKCS7 *p7); +#endif +PKCS7 *PKCS7_dup(PKCS7 *p7); +PKCS7 *d2i_PKCS7_bio(BIO *bp,PKCS7 **p7); +int i2d_PKCS7_bio(BIO *bp,PKCS7 *p7); +#endif + +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT) +DECLARE_ASN1_FUNCTIONS(PKCS7) + +DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN) +DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY) + +DECLARE_ASN1_NDEF_FUNCTION(PKCS7) + +long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg); + +int PKCS7_set_type(PKCS7 *p7, int type); +int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other); +int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data); +int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, + const EVP_MD *dgst); +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_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, + BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, + X509 *x509); + +BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio); +int PKCS7_dataFinal(PKCS7 *p7, BIO *bio); +BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert); + + +PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, + EVP_PKEY *pkey, const EVP_MD *dgst); +X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md); +STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7); + +PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509); +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, const EVP_CIPHER *cipher); + +PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx); +ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si,int nid,int type, + void *data); +int PKCS7_add_attribute (PKCS7_SIGNER_INFO *p7si, int nid, int atrtype, + void *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_OF(X509_ATTRIBUTE) *sk); +int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si,STACK_OF(X509_ATTRIBUTE) *sk); + + +PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags); +int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, + BIO *indata, BIO *out, int flags); +STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, int flags); +PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, + int flags); +int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags); + +int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, + STACK_OF(X509_ALGOR) *cap); +STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si); +int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg); + +int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags); +PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); +int SMIME_crlf_copy(BIO *in, BIO *out, int flags); +int SMIME_text(BIO *in, BIO *out); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_PKCS7_strings(void); + +/* Error codes for the PKCS7 functions. */ + +/* Function codes. */ +#define PKCS7_F_B64_READ_PKCS7 120 +#define PKCS7_F_B64_WRITE_PKCS7 121 +#define PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP 118 +#define PKCS7_F_PKCS7_ADD_CERTIFICATE 100 +#define PKCS7_F_PKCS7_ADD_CRL 101 +#define PKCS7_F_PKCS7_ADD_RECIPIENT_INFO 102 +#define PKCS7_F_PKCS7_ADD_SIGNER 103 +#define PKCS7_F_PKCS7_BIO_ADD_DIGEST 125 +#define PKCS7_F_PKCS7_CTRL 104 +#define PKCS7_F_PKCS7_DATADECODE 112 +#define PKCS7_F_PKCS7_DATAFINAL 128 +#define PKCS7_F_PKCS7_DATAINIT 105 +#define PKCS7_F_PKCS7_DATASIGN 106 +#define PKCS7_F_PKCS7_DATAVERIFY 107 +#define PKCS7_F_PKCS7_DECRYPT 114 +#define PKCS7_F_PKCS7_ENCRYPT 115 +#define PKCS7_F_PKCS7_FIND_DIGEST 127 +#define PKCS7_F_PKCS7_GET0_SIGNERS 124 +#define PKCS7_F_PKCS7_SET_CIPHER 108 +#define PKCS7_F_PKCS7_SET_CONTENT 109 +#define PKCS7_F_PKCS7_SET_DIGEST 126 +#define PKCS7_F_PKCS7_SET_TYPE 110 +#define PKCS7_F_PKCS7_SIGN 116 +#define PKCS7_F_PKCS7_SIGNATUREVERIFY 113 +#define PKCS7_F_PKCS7_SIMPLE_SMIMECAP 119 +#define PKCS7_F_PKCS7_VERIFY 117 +#define PKCS7_F_SMIME_READ_PKCS7 122 +#define PKCS7_F_SMIME_TEXT 123 + +/* Reason codes. */ +#define PKCS7_R_CERTIFICATE_VERIFY_ERROR 117 +#define PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 144 +#define PKCS7_R_CIPHER_NOT_INITIALIZED 116 +#define PKCS7_R_CONTENT_AND_DATA_PRESENT 118 +#define PKCS7_R_DECODE_ERROR 130 +#define PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH 100 +#define PKCS7_R_DECRYPT_ERROR 119 +#define PKCS7_R_DIGEST_FAILURE 101 +#define PKCS7_R_ERROR_ADDING_RECIPIENT 120 +#define PKCS7_R_ERROR_SETTING_CIPHER 121 +#define PKCS7_R_INVALID_MIME_TYPE 131 +#define PKCS7_R_INVALID_NULL_POINTER 143 +#define PKCS7_R_MIME_NO_CONTENT_TYPE 132 +#define PKCS7_R_MIME_PARSE_ERROR 133 +#define PKCS7_R_MIME_SIG_PARSE_ERROR 134 +#define PKCS7_R_MISSING_CERIPEND_INFO 103 +#define PKCS7_R_NO_CONTENT 122 +#define PKCS7_R_NO_CONTENT_TYPE 135 +#define PKCS7_R_NO_MULTIPART_BODY_FAILURE 136 +#define PKCS7_R_NO_MULTIPART_BOUNDARY 137 +#define PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE 115 +#define PKCS7_R_NO_RECIPIENT_MATCHES_KEY 146 +#define PKCS7_R_NO_SIGNATURES_ON_DATA 123 +#define PKCS7_R_NO_SIGNERS 142 +#define PKCS7_R_NO_SIG_CONTENT_TYPE 138 +#define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE 104 +#define PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR 124 +#define PKCS7_R_PKCS7_DATAFINAL 126 +#define PKCS7_R_PKCS7_DATAFINAL_ERROR 125 +#define PKCS7_R_PKCS7_DATASIGN 145 +#define PKCS7_R_PKCS7_PARSE_ERROR 139 +#define PKCS7_R_PKCS7_SIG_PARSE_ERROR 140 +#define PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 127 +#define PKCS7_R_SIGNATURE_FAILURE 105 +#define PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND 128 +#define PKCS7_R_SIG_INVALID_MIME_TYPE 141 +#define PKCS7_R_SMIME_TEXT_ERROR 129 +#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 +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/pq_compat.h b/mswin32/OpenSSL/include/openssl/pq_compat.h new file mode 100755 index 000000000..fd3657888 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/pq_compat.h @@ -0,0 +1,147 @@ +/* crypto/pqueue/pqueue_compat.h */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#include +#include + +/* + * The purpose of this header file is for supporting 64-bit integer + * manipulation on 32-bit (and lower) machines. Currently the only + * such environment is VMS, Utrix and those with smaller default integer + * sizes than 32 bits. For all such environment, we fall back to using + * BIGNUM. We may need to fine tune the conditions for systems that + * are incorrectly configured. + * + * The only clients of this code are (1) pqueue for priority, and + * (2) DTLS, for sequence number manipulation. + */ + +#if (defined(THIRTY_TWO_BIT) && !defined(BN_LLONG)) || defined(SIXTEEN_BIT) || defined(EIGHT_BIT) + +#define PQ_64BIT_IS_INTEGER 0 +#define PQ_64BIT_IS_BIGNUM 1 + +#define PQ_64BIT BIGNUM +#define PQ_64BIT_CTX BN_CTX + +#define pq_64bit_init(x) BN_init(x) +#define pq_64bit_free(x) BN_free(x) + +#define pq_64bit_ctx_new(ctx) BN_CTX_new() +#define pq_64bit_ctx_free(x) BN_CTX_free(x) + +#define pq_64bit_assign(x, y) BN_copy(x, y) +#define pq_64bit_assign_word(x, y) BN_set_word(x, y) +#define pq_64bit_gt(x, y) BN_ucmp(x, y) >= 1 ? 1 : 0 +#define pq_64bit_eq(x, y) BN_ucmp(x, y) == 0 ? 1 : 0 +#define pq_64bit_add_word(x, w) BN_add_word(x, w) +#define pq_64bit_sub(r, x, y) BN_sub(r, x, y) +#define pq_64bit_sub_word(x, w) BN_sub_word(x, w) +#define pq_64bit_mod(r, x, n, ctx) BN_mod(r, x, n, ctx) + +#define pq_64bit_bin2num(bn, bytes, len) BN_bin2bn(bytes, len, bn) +#define pq_64bit_num2bin(bn, bytes) BN_bn2bin(bn, bytes) +#define pq_64bit_get_word(x) BN_get_word(x) +#define pq_64bit_is_bit_set(x, offset) BN_is_bit_set(x, offset) +#define pq_64bit_lshift(r, x, shift) BN_lshift(r, x, shift) +#define pq_64bit_set_bit(x, num) BN_set_bit(x, num) +#define pq_64bit_get_length(x) BN_num_bits((x)) + +#else + +#define PQ_64BIT_IS_INTEGER 1 +#define PQ_64BIT_IS_BIGNUM 0 + +#if defined(SIXTY_FOUR_BIT) +#define PQ_64BIT BN_ULONG +#define PQ_64BIT_PRINT "%lld" +#elif defined(SIXTY_FOUR_BIT_LONG) +#define PQ_64BIT BN_ULONG +#define PQ_64BIT_PRINT "%ld" +#elif defined(THIRTY_TWO_BIT) +#define PQ_64BIT BN_ULLONG +#define PQ_64BIT_PRINT "%lld" +#endif + +#define PQ_64BIT_CTX void + +#define pq_64bit_init(x) +#define pq_64bit_free(x) +#define pq_64bit_ctx_new(ctx) (ctx) +#define pq_64bit_ctx_free(x) + +#define pq_64bit_assign(x, y) (*(x) = *(y)) +#define pq_64bit_assign_word(x, y) (*(x) = y) +#define pq_64bit_gt(x, y) (*(x) > *(y)) +#define pq_64bit_eq(x, y) (*(x) == *(y)) +#define pq_64bit_add_word(x, w) (*(x) = (*(x) + (w))) +#define pq_64bit_sub(r, x, y) (*(r) = (*(x) - *(y))) +#define pq_64bit_sub_word(x, w) (*(x) = (*(x) - (w))) +#define pq_64bit_mod(r, x, n, ctx) + +#define pq_64bit_bin2num(num, bytes, len) bytes_to_long_long(bytes, num) +#define pq_64bit_num2bin(num, bytes) long_long_to_bytes(num, bytes) +#define pq_64bit_get_word(x) *(x) +#define pq_64bit_lshift(r, x, shift) (*(r) = (*(x) << (shift))) +#define pq_64bit_set_bit(x, num) do { \ + PQ_64BIT mask = 1; \ + mask = mask << (num); \ + *(x) |= mask; \ + } while(0) +#endif /* OPENSSL_SYS_VMS */ diff --git a/mswin32/OpenSSL/include/openssl/pqueue.h b/mswin32/OpenSSL/include/openssl/pqueue.h new file mode 100755 index 000000000..02386d130 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/pqueue.h @@ -0,0 +1,95 @@ +/* crypto/pqueue/pqueue.h */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PQUEUE_H +#define HEADER_PQUEUE_H + +#include +#include +#include + +#include + +typedef struct _pqueue *pqueue; + +typedef struct _pitem + { + PQ_64BIT priority; + void *data; + struct _pitem *next; + } pitem; + +typedef struct _pitem *piterator; + +pitem *pitem_new(PQ_64BIT priority, void *data); +void pitem_free(pitem *item); + +pqueue pqueue_new(void); +void pqueue_free(pqueue pq); + +pitem *pqueue_insert(pqueue pq, pitem *item); +pitem *pqueue_peek(pqueue pq); +pitem *pqueue_pop(pqueue pq); +pitem *pqueue_find(pqueue pq, PQ_64BIT priority); +pitem *pqueue_iterator(pqueue pq); +pitem *pqueue_next(piterator *iter); + +void pqueue_print(pqueue pq); + +#endif /* ! HEADER_PQUEUE_H */ diff --git a/mswin32/OpenSSL/include/openssl/rand.h b/mswin32/OpenSSL/include/openssl/rand.h new file mode 100755 index 000000000..ac6c02176 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/rand.h @@ -0,0 +1,140 @@ +/* crypto/rand/rand.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.] + */ + +#ifndef HEADER_RAND_H +#define HEADER_RAND_H + +#include +#include +#include + +#if defined(OPENSSL_SYS_WINDOWS) +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(OPENSSL_FIPS) +#define FIPS_RAND_SIZE_T size_t +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct rand_meth_st RAND_METHOD; */ + +struct rand_meth_st + { + void (*seed)(const void *buf, int num); + int (*bytes)(unsigned char *buf, int num); + void (*cleanup)(void); + void (*add)(const void *buf, int num, double entropy); + int (*pseudorand)(unsigned char *buf, int num); + int (*status)(void); + }; + +#ifdef BN_DEBUG +extern int rand_predictable; +#endif + +int RAND_set_rand_method(const RAND_METHOD *meth); +const RAND_METHOD *RAND_get_rand_method(void); +#ifndef OPENSSL_NO_ENGINE +int RAND_set_rand_engine(ENGINE *engine); +#endif +RAND_METHOD *RAND_SSLeay(void); +void RAND_cleanup(void ); +int RAND_bytes(unsigned char *buf,int num); +int RAND_pseudo_bytes(unsigned char *buf,int num); +void RAND_seed(const void *buf,int num); +void RAND_add(const void *buf,int num,double entropy); +int RAND_load_file(const char *file,long max_bytes); +int RAND_write_file(const char *file); +const char *RAND_file_name(char *file,size_t num); +int RAND_status(void); +int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes); +int RAND_egd(const char *path); +int RAND_egd_bytes(const char *path,int bytes); +int RAND_poll(void); + +#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) + +void RAND_screen(void); +int RAND_event(UINT, WPARAM, LPARAM); + +#endif + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_RAND_strings(void); + +/* Error codes for the RAND functions. */ + +/* Function codes. */ +#define RAND_F_RAND_GET_RAND_METHOD 101 +#define RAND_F_SSLEAY_RAND_BYTES 100 + +/* Reason codes. */ +#define RAND_R_PRNG_NOT_SEEDED 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/rc2.h b/mswin32/OpenSSL/include/openssl/rc2.h new file mode 100755 index 000000000..34c836231 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/rc2.h @@ -0,0 +1,101 @@ +/* crypto/rc2/rc2.h */ +/* 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.] + */ + +#ifndef HEADER_RC2_H +#define HEADER_RC2_H + +#include /* OPENSSL_NO_RC2, RC2_INT */ +#ifdef OPENSSL_NO_RC2 +#error RC2 is disabled. +#endif + +#define RC2_ENCRYPT 1 +#define RC2_DECRYPT 0 + +#define RC2_BLOCK 8 +#define RC2_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc2_key_st + { + RC2_INT data[64]; + } RC2_KEY; + + +void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data,int bits); +void RC2_ecb_encrypt(const unsigned char *in,unsigned char *out,RC2_KEY *key, + int enc); +void RC2_encrypt(unsigned long *data,RC2_KEY *key); +void RC2_decrypt(unsigned long *data,RC2_KEY *key); +void RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + RC2_KEY *ks, unsigned char *iv, int enc); +void RC2_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num, int enc); +void RC2_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/rc4.h b/mswin32/OpenSSL/include/openssl/rc4.h new file mode 100755 index 000000000..7aec04fe9 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/rc4.h @@ -0,0 +1,87 @@ +/* crypto/rc4/rc4.h */ +/* 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.] + */ + +#ifndef HEADER_RC4_H +#define HEADER_RC4_H + +#include /* OPENSSL_NO_RC4, RC4_INT */ +#ifdef OPENSSL_NO_RC4 +#error RC4 is disabled. +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc4_key_st + { + RC4_INT x,y; + RC4_INT data[256]; + } RC4_KEY; + + +const char *RC4_options(void); +void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void RC4(RC4_KEY *key, unsigned long len, const unsigned char *indata, + unsigned char *outdata); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/ripemd.h b/mswin32/OpenSSL/include/openssl/ripemd.h new file mode 100755 index 000000000..033a5965b --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ripemd.h @@ -0,0 +1,104 @@ +/* crypto/ripemd/ripemd.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.] + */ + +#ifndef HEADER_RIPEMD_H +#define HEADER_RIPEMD_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_NO_RIPEMD +#error RIPEMD is disabled. +#endif + +#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__) +#define RIPEMD160_LONG unsigned long +#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +#define RIPEMD160_LONG unsigned long +#define RIPEMD160_LONG_LOG2 3 +#else +#define RIPEMD160_LONG unsigned int +#endif + +#define RIPEMD160_CBLOCK 64 +#define RIPEMD160_LBLOCK (RIPEMD160_CBLOCK/4) +#define RIPEMD160_DIGEST_LENGTH 20 + +typedef struct RIPEMD160state_st + { + RIPEMD160_LONG A,B,C,D,E; + RIPEMD160_LONG Nl,Nh; + RIPEMD160_LONG data[RIPEMD160_LBLOCK]; + unsigned int num; + } RIPEMD160_CTX; + +int RIPEMD160_Init(RIPEMD160_CTX *c); +int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len); +int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); +unsigned char *RIPEMD160(const unsigned char *d, size_t n, + unsigned char *md); +void RIPEMD160_Transform(RIPEMD160_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/rsa.h b/mswin32/OpenSSL/include/openssl/rsa.h new file mode 100755 index 000000000..6b5e4f8a9 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/rsa.h @@ -0,0 +1,455 @@ +/* crypto/rsa/rsa.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.] + */ + +#ifndef HEADER_RSA_H +#define HEADER_RSA_H + +#include + +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifdef OPENSSL_NO_RSA +#error RSA is disabled. +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct rsa_st RSA; */ +/* typedef struct rsa_meth_st RSA_METHOD; */ + +struct rsa_meth_st + { + const char *name; + int (*rsa_pub_enc)(int flen,const unsigned char *from, + unsigned char *to, + RSA *rsa,int padding); + int (*rsa_pub_dec)(int flen,const unsigned char *from, + unsigned char *to, + RSA *rsa,int padding); + int (*rsa_priv_enc)(int flen,const unsigned char *from, + unsigned char *to, + RSA *rsa,int padding); + int (*rsa_priv_dec)(int flen,const unsigned char *from, + unsigned char *to, + RSA *rsa,int padding); + int (*rsa_mod_exp)(BIGNUM *r0,const BIGNUM *I,RSA *rsa,BN_CTX *ctx); /* Can be null */ + int (*bn_mod_exp)(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *m_ctx); /* Can be null */ + int (*init)(RSA *rsa); /* called at new */ + int (*finish)(RSA *rsa); /* called at free */ + int flags; /* RSA_METHOD_FLAG_* things */ + char *app_data; /* may be needed! */ +/* New sign and verify functions: some libraries don't allow arbitrary data + * to be signed/verified: this allows them to be used. Note: for this to work + * the RSA_public_decrypt() and RSA_private_encrypt() should *NOT* be used + * RSA_sign(), RSA_verify() should be used instead. Note: for backwards + * compatibility this functionality is only enabled if the RSA_FLAG_SIGN_VER + * option is set in 'flags'. + */ + int (*rsa_sign)(int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, const RSA *rsa); + int (*rsa_verify)(int dtype, + const unsigned char *m, unsigned int m_length, + unsigned char *sigbuf, unsigned int siglen, const RSA *rsa); +/* If this callback is NULL, the builtin software RSA key-gen will be used. This + * is for behavioural compatibility whilst the code gets rewired, but one day + * it would be nice to assume there are no such things as "builtin software" + * implementations. */ + int (*rsa_keygen)(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); + }; + +struct rsa_st + { + /* The first parameter is used to pickup errors where + * this is passed instead of aEVP_PKEY, it is set to 0 */ + int pad; + long version; + const RSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; + BIGNUM *n; + BIGNUM *e; + BIGNUM *d; + BIGNUM *p; + BIGNUM *q; + BIGNUM *dmp1; + BIGNUM *dmq1; + BIGNUM *iqmp; + /* be careful using this if the RSA structure is shared */ + CRYPTO_EX_DATA ex_data; + int references; + int flags; + + /* Used to cache montgomery values */ + BN_MONT_CTX *_method_mod_n; + BN_MONT_CTX *_method_mod_p; + BN_MONT_CTX *_method_mod_q; + + /* all BIGNUM values are actually in the following data, if it is not + * NULL */ + char *bignum_data; + BN_BLINDING *blinding; + BN_BLINDING *mt_blinding; + }; + +#ifndef OPENSSL_RSA_MAX_MODULUS_BITS +# define OPENSSL_RSA_MAX_MODULUS_BITS 16384 +#endif + +#ifndef OPENSSL_RSA_SMALL_MODULUS_BITS +# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 +#endif +#ifndef OPENSSL_RSA_MAX_PUBEXP_BITS +# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 /* exponent limit enforced for "large" modulus only */ +#endif + +#define RSA_3 0x3L +#define RSA_F4 0x10001L + +#define RSA_METHOD_FLAG_NO_CHECK 0x0001 /* don't check pub/private match */ + +#define RSA_FLAG_CACHE_PUBLIC 0x0002 +#define RSA_FLAG_CACHE_PRIVATE 0x0004 +#define RSA_FLAG_BLINDING 0x0008 +#define RSA_FLAG_THREAD_SAFE 0x0010 +/* This flag means the private key operations will be handled by rsa_mod_exp + * and that they do not depend on the private key components being present: + * for example a key stored in external hardware. Without this flag bn_mod_exp + * gets called when private key components are absent. + */ +#define RSA_FLAG_EXT_PKEY 0x0020 + +/* This flag in the RSA_METHOD enables the new rsa_sign, rsa_verify functions. + */ +#define RSA_FLAG_SIGN_VER 0x0040 + +#define RSA_FLAG_NO_BLINDING 0x0080 /* new with 0.9.6j and 0.9.7b; the built-in + * RSA implementation now uses blinding by + * default (ignoring RSA_FLAG_BLINDING), + * but other engines might not need it + */ +#define RSA_FLAG_NO_CONSTTIME 0x0100 /* new with 0.9.8f; the built-in RSA + * implementation now uses constant time + * operations by default in private key operations, + * e.g., constant time modular exponentiation, + * modular inverse without leaking branches, + * division without leaking branches. This + * flag disables these constant time + * operations and results in faster RSA + * private key operations. + */ +#ifndef OPENSSL_NO_DEPRECATED +#define RSA_FLAG_NO_EXP_CONSTTIME RSA_FLAG_NO_CONSTTIME /* deprecated name for the flag*/ + /* new with 0.9.7h; the built-in RSA + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ +#endif + + +#define RSA_PKCS1_PADDING 1 +#define RSA_SSLV23_PADDING 2 +#define RSA_NO_PADDING 3 +#define RSA_PKCS1_OAEP_PADDING 4 +#define RSA_X931_PADDING 5 + +#define RSA_PKCS1_PADDING_SIZE 11 + +#define RSA_set_app_data(s,arg) RSA_set_ex_data(s,0,arg) +#define RSA_get_app_data(s) RSA_get_ex_data(s,0) + +RSA * RSA_new(void); +RSA * RSA_new_method(ENGINE *engine); +int RSA_size(const RSA *); + +/* Deprecated version */ +#ifndef OPENSSL_NO_DEPRECATED +RSA * RSA_generate_key(int bits, unsigned long e,void + (*callback)(int,int,void *),void *cb_arg); +#endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); + +int RSA_check_key(const RSA *); + /* next 4 return -1 on error */ +int RSA_public_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa,int padding); +int RSA_private_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa,int padding); +int RSA_public_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa,int padding); +int RSA_private_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa,int padding); +void RSA_free (RSA *r); +/* "up" the RSA object's reference count */ +int RSA_up_ref(RSA *r); + +int RSA_flags(const RSA *r); + +void RSA_set_default_method(const RSA_METHOD *meth); +const RSA_METHOD *RSA_get_default_method(void); +const RSA_METHOD *RSA_get_method(const RSA *rsa); +int RSA_set_method(RSA *rsa, const RSA_METHOD *meth); + +/* This function needs the memory locking malloc callbacks to be installed */ +int RSA_memory_lock(RSA *r); + +/* these are the actual SSLeay RSA functions */ +const RSA_METHOD *RSA_PKCS1_SSLeay(void); + +const RSA_METHOD *RSA_null_method(void); + +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPublicKey) +DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPrivateKey) + +#ifndef OPENSSL_NO_FP_API +int RSA_print_fp(FILE *fp, const RSA *r,int offset); +#endif + +#ifndef OPENSSL_NO_BIO +int RSA_print(BIO *bp, const RSA *r,int offset); +#endif + +int i2d_RSA_NET(const RSA *a, unsigned char **pp, + int (*cb)(char *buf, int len, const char *prompt, int verify), + int sgckey); +RSA *d2i_RSA_NET(RSA **a, const unsigned char **pp, long length, + int (*cb)(char *buf, int len, const char *prompt, int verify), + int sgckey); + +int i2d_Netscape_RSA(const RSA *a, unsigned char **pp, + int (*cb)(char *buf, int len, const char *prompt, + int verify)); +RSA *d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length, + int (*cb)(char *buf, int len, const char *prompt, + int verify)); + +/* The following 2 functions sign and verify a X509_SIG ASN1 object + * inside PKCS#1 padded RSA encryption */ +int RSA_sign(int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, RSA *rsa); +int RSA_verify(int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigbuf, unsigned int siglen, RSA *rsa); + +/* The following 2 function sign and verify a ASN1_OCTET_STRING + * object inside PKCS#1 padded RSA encryption */ +int RSA_sign_ASN1_OCTET_STRING(int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, RSA *rsa); +int RSA_verify_ASN1_OCTET_STRING(int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigbuf, unsigned int siglen, RSA *rsa); + +int RSA_blinding_on(RSA *rsa, BN_CTX *ctx); +void RSA_blinding_off(RSA *rsa); +BN_BLINDING *RSA_setup_blinding(RSA *rsa, BN_CTX *ctx); + +int RSA_padding_add_PKCS1_type_1(unsigned char *to,int tlen, + const unsigned char *f,int fl); +int RSA_padding_check_PKCS1_type_1(unsigned char *to,int tlen, + const unsigned char *f,int fl,int rsa_len); +int RSA_padding_add_PKCS1_type_2(unsigned char *to,int tlen, + const unsigned char *f,int fl); +int RSA_padding_check_PKCS1_type_2(unsigned char *to,int tlen, + const unsigned char *f,int fl,int rsa_len); +int PKCS1_MGF1(unsigned char *mask, long len, + const unsigned char *seed, long seedlen, const EVP_MD *dgst); +int RSA_padding_add_PKCS1_OAEP(unsigned char *to,int tlen, + const unsigned char *f,int fl, + const unsigned char *p,int pl); +int RSA_padding_check_PKCS1_OAEP(unsigned char *to,int tlen, + const unsigned char *f,int fl,int rsa_len, + const unsigned char *p,int pl); +int RSA_padding_add_SSLv23(unsigned char *to,int tlen, + const unsigned char *f,int fl); +int RSA_padding_check_SSLv23(unsigned char *to,int tlen, + const unsigned char *f,int fl,int rsa_len); +int RSA_padding_add_none(unsigned char *to,int tlen, + const unsigned char *f,int fl); +int RSA_padding_check_none(unsigned char *to,int tlen, + const unsigned char *f,int fl,int rsa_len); +int RSA_padding_add_X931(unsigned char *to,int tlen, + const unsigned char *f,int fl); +int RSA_padding_check_X931(unsigned char *to,int tlen, + const unsigned char *f,int fl,int rsa_len); +int RSA_X931_hash_id(int nid); + +int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const unsigned char *EM, int sLen); +int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, + const EVP_MD *Hash, int sLen); + +int RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int RSA_set_ex_data(RSA *r,int idx,void *arg); +void *RSA_get_ex_data(const RSA *r, int idx); + +RSA *RSAPublicKey_dup(RSA *rsa); +RSA *RSAPrivateKey_dup(RSA *rsa); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_RSA_strings(void); + +/* Error codes for the RSA functions. */ + +/* Function codes. */ +#define RSA_F_MEMORY_LOCK 100 +#define RSA_F_RSA_BUILTIN_KEYGEN 129 +#define RSA_F_RSA_CHECK_KEY 123 +#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_MEMORY_LOCK 130 +#define RSA_F_RSA_NEW_METHOD 106 +#define RSA_F_RSA_NULL 124 +#define RSA_F_RSA_NULL_MOD_EXP 131 +#define RSA_F_RSA_NULL_PRIVATE_DECRYPT 132 +#define RSA_F_RSA_NULL_PRIVATE_ENCRYPT 133 +#define RSA_F_RSA_NULL_PUBLIC_DECRYPT 134 +#define RSA_F_RSA_NULL_PUBLIC_ENCRYPT 135 +#define RSA_F_RSA_PADDING_ADD_NONE 107 +#define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP 121 +#define RSA_F_RSA_PADDING_ADD_PKCS1_PSS 125 +#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_ADD_X931 127 +#define RSA_F_RSA_PADDING_CHECK_NONE 111 +#define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP 122 +#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_PADDING_CHECK_X931 128 +#define RSA_F_RSA_PRINT 115 +#define RSA_F_RSA_PRINT_FP 116 +#define RSA_F_RSA_SETUP_BLINDING 136 +#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 +#define RSA_F_RSA_VERIFY_PKCS1_PSS 126 + +/* Reason codes. */ +#define RSA_R_ALGORITHM_MISMATCH 100 +#define RSA_R_BAD_E_VALUE 101 +#define RSA_R_BAD_FIXED_HEADER_DECRYPT 102 +#define RSA_R_BAD_PAD_BYTE_COUNT 103 +#define RSA_R_BAD_SIGNATURE 104 +#define RSA_R_BLOCK_TYPE_IS_NOT_01 106 +#define RSA_R_BLOCK_TYPE_IS_NOT_02 107 +#define RSA_R_DATA_GREATER_THAN_MOD_LEN 108 +#define RSA_R_DATA_TOO_LARGE 109 +#define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 110 +#define RSA_R_DATA_TOO_LARGE_FOR_MODULUS 132 +#define RSA_R_DATA_TOO_SMALL 111 +#define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 122 +#define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY 112 +#define RSA_R_DMP1_NOT_CONGRUENT_TO_D 124 +#define RSA_R_DMQ1_NOT_CONGRUENT_TO_D 125 +#define RSA_R_D_E_NOT_CONGRUENT_TO_1 123 +#define RSA_R_FIRST_OCTET_INVALID 133 +#define RSA_R_INVALID_HEADER 137 +#define RSA_R_INVALID_MESSAGE_LENGTH 131 +#define RSA_R_INVALID_PADDING 138 +#define RSA_R_INVALID_TRAILER 139 +#define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 +#define RSA_R_KEY_SIZE_TOO_SMALL 120 +#define RSA_R_LAST_OCTET_INVALID 134 +#define RSA_R_MODULUS_TOO_LARGE 105 +#define RSA_R_NO_PUBLIC_EXPONENT 140 +#define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 +#define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 +#define RSA_R_OAEP_DECODING_ERROR 121 +#define RSA_R_PADDING_CHECK_FAILED 114 +#define RSA_R_P_NOT_PRIME 128 +#define RSA_R_Q_NOT_PRIME 129 +#define RSA_R_RSA_OPERATIONS_NOT_SUPPORTED 130 +#define RSA_R_SLEN_CHECK_FAILED 136 +#define RSA_R_SLEN_RECOVERY_FAILED 135 +#define RSA_R_SSLV3_ROLLBACK_ATTACK 115 +#define RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 116 +#define RSA_R_UNKNOWN_ALGORITHM_TYPE 117 +#define RSA_R_UNKNOWN_PADDING_TYPE 118 +#define RSA_R_WRONG_SIGNATURE_LENGTH 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/safestack.h b/mswin32/OpenSSL/include/openssl/safestack.h new file mode 100755 index 000000000..53df649ec --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/safestack.h @@ -0,0 +1,1854 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SAFESTACK_H +#define HEADER_SAFESTACK_H + +#include + +#ifdef DEBUG_SAFESTACK + +#ifndef CHECKED_PTR_OF +#define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +#endif + +#define CHECKED_SK_FREE_FUNC(type, p) \ + ((void (*)(void *)) ((1 ? p : (void (*)(type *))0))) + +#define CHECKED_SK_CMP_FUNC(type, p) \ + ((int (*)(const char * const *, const char * const *)) \ + ((1 ? p : (int (*)(const type * const *, const type * const *))0))) + +#define STACK_OF(type) struct stack_st_##type +#define PREDECLARE_STACK_OF(type) STACK_OF(type); + +#define DECLARE_STACK_OF(type) \ +STACK_OF(type) \ + { \ + STACK stack; \ + }; + +#define IMPLEMENT_STACK_OF(type) /* nada (obsolete in new safestack approach)*/ + +/* SKM_sk_... stack macros are internal to safestack.h: + * never use them directly, use sk__... instead */ +#define SKM_sk_new(type, cmp) \ + ((STACK_OF(type) *)sk_new(CHECKED_SK_CMP_FUNC(type, cmp))) +#define SKM_sk_new_null(type) \ + ((STACK_OF(type) *)sk_new_null()) +#define SKM_sk_free(type, st) \ + sk_free(CHECKED_PTR_OF(STACK_OF(type), st)) +#define SKM_sk_num(type, st) \ + sk_num(CHECKED_PTR_OF(STACK_OF(type), st)) +#define SKM_sk_value(type, st,i) \ + ((type *)sk_value(CHECKED_PTR_OF(STACK_OF(type), st), i)) +#define SKM_sk_set(type, st,i,val) \ + sk_set(CHECKED_PTR_OF(STACK_OF(type), st), i, CHECKED_PTR_OF(type, val)) +#define SKM_sk_zero(type, st) \ + sk_zero(CHECKED_PTR_OF(STACK_OF(type), st)) +#define SKM_sk_push(type, st,val) \ + sk_push(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_PTR_OF(type, val)) +#define SKM_sk_unshift(type, st,val) \ + sk_unshift(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_PTR_OF(type, val)) +#define SKM_sk_find(type, st,val) \ + sk_find(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_PTR_OF(type, val)) +#define SKM_sk_delete(type, st,i) \ + (type *)sk_delete(CHECKED_PTR_OF(STACK_OF(type), st), i) +#define SKM_sk_delete_ptr(type, st,ptr) \ + (type *)sk_delete_ptr(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_PTR_OF(type, ptr)) +#define SKM_sk_insert(type, st,val,i) \ + sk_insert(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_PTR_OF(type, val), i) +#define SKM_sk_set_cmp_func(type, st,cmp) \ + ((int (*)(const type * const *,const type * const *)) \ + sk_set_cmp_func(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_SK_CMP_FUNC(type, cmp))) +#define SKM_sk_dup(type, st) \ + (STACK_OF(type) *)sk_dup(CHECKED_PTR_OF(STACK_OF(type), st)) +#define SKM_sk_pop_free(type, st,free_func) \ + sk_pop_free(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_SK_FREE_FUNC(type, free_func)) +#define SKM_sk_shift(type, st) \ + (type *)sk_shift(CHECKED_PTR_OF(STACK_OF(type), st)) +#define SKM_sk_pop(type, st) \ + (type *)sk_pop(CHECKED_PTR_OF(STACK_OF(type), st)) +#define SKM_sk_sort(type, st) \ + sk_sort(CHECKED_PTR_OF(STACK_OF(type), st)) +#define SKM_sk_is_sorted(type, st) \ + sk_is_sorted(CHECKED_PTR_OF(STACK_OF(type), st)) + +#define SKM_ASN1_SET_OF_d2i(type, st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + (STACK_OF(type) *)d2i_ASN1_SET(CHECKED_PTR_OF(STACK_OF(type), st), \ + pp, length, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + ex_tag, ex_class) + +#define SKM_ASN1_SET_OF_i2d(type, st, pp, i2d_func, ex_tag, ex_class, is_set) \ + i2d_ASN1_SET(CHECKED_PTR_OF(STACK_OF(type), st), pp, \ + CHECKED_I2D_OF(type, i2d_func), \ + ex_tag, ex_class, is_set) + +#define SKM_ASN1_seq_pack(type, st, i2d_func, buf, len) \ + ASN1_seq_pack(CHECKED_PTR_OF(STACK_OF(type), st), \ + CHECKED_I2D_OF(type, i2d_func), buf, len) + +#define SKM_ASN1_seq_unpack(type, buf, len, d2i_func, free_func) \ + (STACK_OF(type) *)ASN1_seq_unpack(buf, len, CHECKED_D2I_OF(type, d2i_func), CHECKED_SK_FREE_FUNC(type, free_func)) + +#define SKM_PKCS12_decrypt_d2i(type, algor, d2i_func, free_func, pass, passlen, oct, seq) \ + (STACK_OF(type) *)PKCS12_decrypt_d2i(algor, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + pass, passlen, oct, seq) + +#else + +#define STACK_OF(type) STACK +#define PREDECLARE_STACK_OF(type) /* nada */ +#define DECLARE_STACK_OF(type) /* nada */ +#define IMPLEMENT_STACK_OF(type) /* nada */ + +#define SKM_sk_new(type, cmp) \ + sk_new((int (*)(const char * const *, const char * const *))(cmp)) +#define SKM_sk_new_null(type) \ + sk_new_null() +#define SKM_sk_free(type, st) \ + sk_free(st) +#define SKM_sk_num(type, st) \ + sk_num(st) +#define SKM_sk_value(type, st,i) \ + ((type *)sk_value(st, i)) +#define SKM_sk_set(type, st,i,val) \ + ((type *)sk_set(st, i,(char *)val)) +#define SKM_sk_zero(type, st) \ + sk_zero(st) +#define SKM_sk_push(type, st,val) \ + sk_push(st, (char *)val) +#define SKM_sk_unshift(type, st,val) \ + sk_unshift(st, val) +#define SKM_sk_find(type, st,val) \ + sk_find(st, (char *)val) +#define SKM_sk_delete(type, st,i) \ + ((type *)sk_delete(st, i)) +#define SKM_sk_delete_ptr(type, st,ptr) \ + ((type *)sk_delete_ptr(st,(char *)ptr)) +#define SKM_sk_insert(type, st,val,i) \ + sk_insert(st, (char *)val, i) +#define SKM_sk_set_cmp_func(type, st,cmp) \ + ((int (*)(const type * const *,const type * const *)) \ + sk_set_cmp_func(st, (int (*)(const char * const *, const char * const *))(cmp))) +#define SKM_sk_dup(type, st) \ + sk_dup(st) +#define SKM_sk_pop_free(type, st,free_func) \ + sk_pop_free(st, (void (*)(void *))free_func) +#define SKM_sk_shift(type, st) \ + ((type *)sk_shift(st)) +#define SKM_sk_pop(type, st) \ + ((type *)sk_pop(st)) +#define SKM_sk_sort(type, st) \ + sk_sort(st) +#define SKM_sk_is_sorted(type, st) \ + sk_is_sorted(st) + +#define SKM_ASN1_SET_OF_d2i(type, st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + d2i_ASN1_SET(st,pp,length, (void *(*)(void ** ,const unsigned char ** ,long))d2i_func, (void (*)(void *))free_func, ex_tag,ex_class) +#define SKM_ASN1_SET_OF_i2d(type, st, pp, i2d_func, ex_tag, ex_class, is_set) \ + i2d_ASN1_SET(st,pp,(int (*)(void *, unsigned char **))i2d_func,ex_tag,ex_class,is_set) + +#define SKM_ASN1_seq_pack(type, st, i2d_func, buf, len) \ + ASN1_seq_pack(st, (int (*)(void *, unsigned char **))i2d_func, buf, len) +#define SKM_ASN1_seq_unpack(type, buf, len, d2i_func, free_func) \ + ASN1_seq_unpack(buf,len,(void *(*)(void **,const unsigned char **,long))d2i_func, (void(*)(void *))free_func) + +#define SKM_PKCS12_decrypt_d2i(type, algor, d2i_func, free_func, pass, passlen, oct, seq) \ + ((STACK *)PKCS12_decrypt_d2i(algor,(char *(*)())d2i_func, (void(*)(void *))free_func,pass,passlen,oct,seq)) + +#endif + +/* This block of defines is updated by util/mkstack.pl, please do not touch! */ +#define sk_ACCESS_DESCRIPTION_new(st) SKM_sk_new(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_new_null() SKM_sk_new_null(ACCESS_DESCRIPTION) +#define sk_ACCESS_DESCRIPTION_free(st) SKM_sk_free(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_num(st) SKM_sk_num(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_value(st, i) SKM_sk_value(ACCESS_DESCRIPTION, (st), (i)) +#define sk_ACCESS_DESCRIPTION_set(st, i, val) SKM_sk_set(ACCESS_DESCRIPTION, (st), (i), (val)) +#define sk_ACCESS_DESCRIPTION_zero(st) SKM_sk_zero(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_push(st, val) SKM_sk_push(ACCESS_DESCRIPTION, (st), (val)) +#define sk_ACCESS_DESCRIPTION_unshift(st, val) SKM_sk_unshift(ACCESS_DESCRIPTION, (st), (val)) +#define sk_ACCESS_DESCRIPTION_find(st, val) SKM_sk_find(ACCESS_DESCRIPTION, (st), (val)) +#define sk_ACCESS_DESCRIPTION_find_ex(st, val) SKM_sk_find_ex(ACCESS_DESCRIPTION, (st), (val)) +#define sk_ACCESS_DESCRIPTION_delete(st, i) SKM_sk_delete(ACCESS_DESCRIPTION, (st), (i)) +#define sk_ACCESS_DESCRIPTION_delete_ptr(st, ptr) SKM_sk_delete_ptr(ACCESS_DESCRIPTION, (st), (ptr)) +#define sk_ACCESS_DESCRIPTION_insert(st, val, i) SKM_sk_insert(ACCESS_DESCRIPTION, (st), (val), (i)) +#define sk_ACCESS_DESCRIPTION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ACCESS_DESCRIPTION, (st), (cmp)) +#define sk_ACCESS_DESCRIPTION_dup(st) SKM_sk_dup(ACCESS_DESCRIPTION, st) +#define sk_ACCESS_DESCRIPTION_pop_free(st, free_func) SKM_sk_pop_free(ACCESS_DESCRIPTION, (st), (free_func)) +#define sk_ACCESS_DESCRIPTION_shift(st) SKM_sk_shift(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_pop(st) SKM_sk_pop(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_sort(st) SKM_sk_sort(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_is_sorted(st) SKM_sk_is_sorted(ACCESS_DESCRIPTION, (st)) + +#define sk_ASIdOrRange_new(st) SKM_sk_new(ASIdOrRange, (st)) +#define sk_ASIdOrRange_new_null() SKM_sk_new_null(ASIdOrRange) +#define sk_ASIdOrRange_free(st) SKM_sk_free(ASIdOrRange, (st)) +#define sk_ASIdOrRange_num(st) SKM_sk_num(ASIdOrRange, (st)) +#define sk_ASIdOrRange_value(st, i) SKM_sk_value(ASIdOrRange, (st), (i)) +#define sk_ASIdOrRange_set(st, i, val) SKM_sk_set(ASIdOrRange, (st), (i), (val)) +#define sk_ASIdOrRange_zero(st) SKM_sk_zero(ASIdOrRange, (st)) +#define sk_ASIdOrRange_push(st, val) SKM_sk_push(ASIdOrRange, (st), (val)) +#define sk_ASIdOrRange_unshift(st, val) SKM_sk_unshift(ASIdOrRange, (st), (val)) +#define sk_ASIdOrRange_find(st, val) SKM_sk_find(ASIdOrRange, (st), (val)) +#define sk_ASIdOrRange_find_ex(st, val) SKM_sk_find_ex(ASIdOrRange, (st), (val)) +#define sk_ASIdOrRange_delete(st, i) SKM_sk_delete(ASIdOrRange, (st), (i)) +#define sk_ASIdOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASIdOrRange, (st), (ptr)) +#define sk_ASIdOrRange_insert(st, val, i) SKM_sk_insert(ASIdOrRange, (st), (val), (i)) +#define sk_ASIdOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASIdOrRange, (st), (cmp)) +#define sk_ASIdOrRange_dup(st) SKM_sk_dup(ASIdOrRange, st) +#define sk_ASIdOrRange_pop_free(st, free_func) SKM_sk_pop_free(ASIdOrRange, (st), (free_func)) +#define sk_ASIdOrRange_shift(st) SKM_sk_shift(ASIdOrRange, (st)) +#define sk_ASIdOrRange_pop(st) SKM_sk_pop(ASIdOrRange, (st)) +#define sk_ASIdOrRange_sort(st) SKM_sk_sort(ASIdOrRange, (st)) +#define sk_ASIdOrRange_is_sorted(st) SKM_sk_is_sorted(ASIdOrRange, (st)) + +#define sk_ASN1_GENERALSTRING_new(st) SKM_sk_new(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_new_null() SKM_sk_new_null(ASN1_GENERALSTRING) +#define sk_ASN1_GENERALSTRING_free(st) SKM_sk_free(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_num(st) SKM_sk_num(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_value(st, i) SKM_sk_value(ASN1_GENERALSTRING, (st), (i)) +#define sk_ASN1_GENERALSTRING_set(st, i, val) SKM_sk_set(ASN1_GENERALSTRING, (st), (i), (val)) +#define sk_ASN1_GENERALSTRING_zero(st) SKM_sk_zero(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_push(st, val) SKM_sk_push(ASN1_GENERALSTRING, (st), (val)) +#define sk_ASN1_GENERALSTRING_unshift(st, val) SKM_sk_unshift(ASN1_GENERALSTRING, (st), (val)) +#define sk_ASN1_GENERALSTRING_find(st, val) SKM_sk_find(ASN1_GENERALSTRING, (st), (val)) +#define sk_ASN1_GENERALSTRING_find_ex(st, val) SKM_sk_find_ex(ASN1_GENERALSTRING, (st), (val)) +#define sk_ASN1_GENERALSTRING_delete(st, i) SKM_sk_delete(ASN1_GENERALSTRING, (st), (i)) +#define sk_ASN1_GENERALSTRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_GENERALSTRING, (st), (ptr)) +#define sk_ASN1_GENERALSTRING_insert(st, val, i) SKM_sk_insert(ASN1_GENERALSTRING, (st), (val), (i)) +#define sk_ASN1_GENERALSTRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_GENERALSTRING, (st), (cmp)) +#define sk_ASN1_GENERALSTRING_dup(st) SKM_sk_dup(ASN1_GENERALSTRING, st) +#define sk_ASN1_GENERALSTRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_GENERALSTRING, (st), (free_func)) +#define sk_ASN1_GENERALSTRING_shift(st) SKM_sk_shift(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_pop(st) SKM_sk_pop(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_sort(st) SKM_sk_sort(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_is_sorted(st) SKM_sk_is_sorted(ASN1_GENERALSTRING, (st)) + +#define sk_ASN1_INTEGER_new(st) SKM_sk_new(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_new_null() SKM_sk_new_null(ASN1_INTEGER) +#define sk_ASN1_INTEGER_free(st) SKM_sk_free(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_num(st) SKM_sk_num(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_value(st, i) SKM_sk_value(ASN1_INTEGER, (st), (i)) +#define sk_ASN1_INTEGER_set(st, i, val) SKM_sk_set(ASN1_INTEGER, (st), (i), (val)) +#define sk_ASN1_INTEGER_zero(st) SKM_sk_zero(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_push(st, val) SKM_sk_push(ASN1_INTEGER, (st), (val)) +#define sk_ASN1_INTEGER_unshift(st, val) SKM_sk_unshift(ASN1_INTEGER, (st), (val)) +#define sk_ASN1_INTEGER_find(st, val) SKM_sk_find(ASN1_INTEGER, (st), (val)) +#define sk_ASN1_INTEGER_find_ex(st, val) SKM_sk_find_ex(ASN1_INTEGER, (st), (val)) +#define sk_ASN1_INTEGER_delete(st, i) SKM_sk_delete(ASN1_INTEGER, (st), (i)) +#define sk_ASN1_INTEGER_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_INTEGER, (st), (ptr)) +#define sk_ASN1_INTEGER_insert(st, val, i) SKM_sk_insert(ASN1_INTEGER, (st), (val), (i)) +#define sk_ASN1_INTEGER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_INTEGER, (st), (cmp)) +#define sk_ASN1_INTEGER_dup(st) SKM_sk_dup(ASN1_INTEGER, st) +#define sk_ASN1_INTEGER_pop_free(st, free_func) SKM_sk_pop_free(ASN1_INTEGER, (st), (free_func)) +#define sk_ASN1_INTEGER_shift(st) SKM_sk_shift(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_pop(st) SKM_sk_pop(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_sort(st) SKM_sk_sort(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_is_sorted(st) SKM_sk_is_sorted(ASN1_INTEGER, (st)) + +#define sk_ASN1_OBJECT_new(st) SKM_sk_new(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_new_null() SKM_sk_new_null(ASN1_OBJECT) +#define sk_ASN1_OBJECT_free(st) SKM_sk_free(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_num(st) SKM_sk_num(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_value(st, i) SKM_sk_value(ASN1_OBJECT, (st), (i)) +#define sk_ASN1_OBJECT_set(st, i, val) SKM_sk_set(ASN1_OBJECT, (st), (i), (val)) +#define sk_ASN1_OBJECT_zero(st) SKM_sk_zero(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_push(st, val) SKM_sk_push(ASN1_OBJECT, (st), (val)) +#define sk_ASN1_OBJECT_unshift(st, val) SKM_sk_unshift(ASN1_OBJECT, (st), (val)) +#define sk_ASN1_OBJECT_find(st, val) SKM_sk_find(ASN1_OBJECT, (st), (val)) +#define sk_ASN1_OBJECT_find_ex(st, val) SKM_sk_find_ex(ASN1_OBJECT, (st), (val)) +#define sk_ASN1_OBJECT_delete(st, i) SKM_sk_delete(ASN1_OBJECT, (st), (i)) +#define sk_ASN1_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_OBJECT, (st), (ptr)) +#define sk_ASN1_OBJECT_insert(st, val, i) SKM_sk_insert(ASN1_OBJECT, (st), (val), (i)) +#define sk_ASN1_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_OBJECT, (st), (cmp)) +#define sk_ASN1_OBJECT_dup(st) SKM_sk_dup(ASN1_OBJECT, st) +#define sk_ASN1_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(ASN1_OBJECT, (st), (free_func)) +#define sk_ASN1_OBJECT_shift(st) SKM_sk_shift(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_pop(st) SKM_sk_pop(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_sort(st) SKM_sk_sort(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_is_sorted(st) SKM_sk_is_sorted(ASN1_OBJECT, (st)) + +#define sk_ASN1_STRING_TABLE_new(st) SKM_sk_new(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_new_null() SKM_sk_new_null(ASN1_STRING_TABLE) +#define sk_ASN1_STRING_TABLE_free(st) SKM_sk_free(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_num(st) SKM_sk_num(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_value(st, i) SKM_sk_value(ASN1_STRING_TABLE, (st), (i)) +#define sk_ASN1_STRING_TABLE_set(st, i, val) SKM_sk_set(ASN1_STRING_TABLE, (st), (i), (val)) +#define sk_ASN1_STRING_TABLE_zero(st) SKM_sk_zero(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_push(st, val) SKM_sk_push(ASN1_STRING_TABLE, (st), (val)) +#define sk_ASN1_STRING_TABLE_unshift(st, val) SKM_sk_unshift(ASN1_STRING_TABLE, (st), (val)) +#define sk_ASN1_STRING_TABLE_find(st, val) SKM_sk_find(ASN1_STRING_TABLE, (st), (val)) +#define sk_ASN1_STRING_TABLE_find_ex(st, val) SKM_sk_find_ex(ASN1_STRING_TABLE, (st), (val)) +#define sk_ASN1_STRING_TABLE_delete(st, i) SKM_sk_delete(ASN1_STRING_TABLE, (st), (i)) +#define sk_ASN1_STRING_TABLE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_STRING_TABLE, (st), (ptr)) +#define sk_ASN1_STRING_TABLE_insert(st, val, i) SKM_sk_insert(ASN1_STRING_TABLE, (st), (val), (i)) +#define sk_ASN1_STRING_TABLE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_STRING_TABLE, (st), (cmp)) +#define sk_ASN1_STRING_TABLE_dup(st) SKM_sk_dup(ASN1_STRING_TABLE, st) +#define sk_ASN1_STRING_TABLE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_STRING_TABLE, (st), (free_func)) +#define sk_ASN1_STRING_TABLE_shift(st) SKM_sk_shift(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_pop(st) SKM_sk_pop(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_sort(st) SKM_sk_sort(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_is_sorted(st) SKM_sk_is_sorted(ASN1_STRING_TABLE, (st)) + +#define sk_ASN1_TYPE_new(st) SKM_sk_new(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_new_null() SKM_sk_new_null(ASN1_TYPE) +#define sk_ASN1_TYPE_free(st) SKM_sk_free(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_num(st) SKM_sk_num(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_value(st, i) SKM_sk_value(ASN1_TYPE, (st), (i)) +#define sk_ASN1_TYPE_set(st, i, val) SKM_sk_set(ASN1_TYPE, (st), (i), (val)) +#define sk_ASN1_TYPE_zero(st) SKM_sk_zero(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_push(st, val) SKM_sk_push(ASN1_TYPE, (st), (val)) +#define sk_ASN1_TYPE_unshift(st, val) SKM_sk_unshift(ASN1_TYPE, (st), (val)) +#define sk_ASN1_TYPE_find(st, val) SKM_sk_find(ASN1_TYPE, (st), (val)) +#define sk_ASN1_TYPE_find_ex(st, val) SKM_sk_find_ex(ASN1_TYPE, (st), (val)) +#define sk_ASN1_TYPE_delete(st, i) SKM_sk_delete(ASN1_TYPE, (st), (i)) +#define sk_ASN1_TYPE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_TYPE, (st), (ptr)) +#define sk_ASN1_TYPE_insert(st, val, i) SKM_sk_insert(ASN1_TYPE, (st), (val), (i)) +#define sk_ASN1_TYPE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_TYPE, (st), (cmp)) +#define sk_ASN1_TYPE_dup(st) SKM_sk_dup(ASN1_TYPE, st) +#define sk_ASN1_TYPE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_TYPE, (st), (free_func)) +#define sk_ASN1_TYPE_shift(st) SKM_sk_shift(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_pop(st) SKM_sk_pop(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_sort(st) SKM_sk_sort(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_is_sorted(st) SKM_sk_is_sorted(ASN1_TYPE, (st)) + +#define sk_ASN1_VALUE_new(st) SKM_sk_new(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_new_null() SKM_sk_new_null(ASN1_VALUE) +#define sk_ASN1_VALUE_free(st) SKM_sk_free(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_num(st) SKM_sk_num(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_value(st, i) SKM_sk_value(ASN1_VALUE, (st), (i)) +#define sk_ASN1_VALUE_set(st, i, val) SKM_sk_set(ASN1_VALUE, (st), (i), (val)) +#define sk_ASN1_VALUE_zero(st) SKM_sk_zero(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_push(st, val) SKM_sk_push(ASN1_VALUE, (st), (val)) +#define sk_ASN1_VALUE_unshift(st, val) SKM_sk_unshift(ASN1_VALUE, (st), (val)) +#define sk_ASN1_VALUE_find(st, val) SKM_sk_find(ASN1_VALUE, (st), (val)) +#define sk_ASN1_VALUE_find_ex(st, val) SKM_sk_find_ex(ASN1_VALUE, (st), (val)) +#define sk_ASN1_VALUE_delete(st, i) SKM_sk_delete(ASN1_VALUE, (st), (i)) +#define sk_ASN1_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_VALUE, (st), (ptr)) +#define sk_ASN1_VALUE_insert(st, val, i) SKM_sk_insert(ASN1_VALUE, (st), (val), (i)) +#define sk_ASN1_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_VALUE, (st), (cmp)) +#define sk_ASN1_VALUE_dup(st) SKM_sk_dup(ASN1_VALUE, st) +#define sk_ASN1_VALUE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_VALUE, (st), (free_func)) +#define sk_ASN1_VALUE_shift(st) SKM_sk_shift(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_pop(st) SKM_sk_pop(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_sort(st) SKM_sk_sort(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_is_sorted(st) SKM_sk_is_sorted(ASN1_VALUE, (st)) + +#define sk_BIO_new(st) SKM_sk_new(BIO, (st)) +#define sk_BIO_new_null() SKM_sk_new_null(BIO) +#define sk_BIO_free(st) SKM_sk_free(BIO, (st)) +#define sk_BIO_num(st) SKM_sk_num(BIO, (st)) +#define sk_BIO_value(st, i) SKM_sk_value(BIO, (st), (i)) +#define sk_BIO_set(st, i, val) SKM_sk_set(BIO, (st), (i), (val)) +#define sk_BIO_zero(st) SKM_sk_zero(BIO, (st)) +#define sk_BIO_push(st, val) SKM_sk_push(BIO, (st), (val)) +#define sk_BIO_unshift(st, val) SKM_sk_unshift(BIO, (st), (val)) +#define sk_BIO_find(st, val) SKM_sk_find(BIO, (st), (val)) +#define sk_BIO_find_ex(st, val) SKM_sk_find_ex(BIO, (st), (val)) +#define sk_BIO_delete(st, i) SKM_sk_delete(BIO, (st), (i)) +#define sk_BIO_delete_ptr(st, ptr) SKM_sk_delete_ptr(BIO, (st), (ptr)) +#define sk_BIO_insert(st, val, i) SKM_sk_insert(BIO, (st), (val), (i)) +#define sk_BIO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BIO, (st), (cmp)) +#define sk_BIO_dup(st) SKM_sk_dup(BIO, st) +#define sk_BIO_pop_free(st, free_func) SKM_sk_pop_free(BIO, (st), (free_func)) +#define sk_BIO_shift(st) SKM_sk_shift(BIO, (st)) +#define sk_BIO_pop(st) SKM_sk_pop(BIO, (st)) +#define sk_BIO_sort(st) SKM_sk_sort(BIO, (st)) +#define sk_BIO_is_sorted(st) SKM_sk_is_sorted(BIO, (st)) + +#define sk_CONF_IMODULE_new(st) SKM_sk_new(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_new_null() SKM_sk_new_null(CONF_IMODULE) +#define sk_CONF_IMODULE_free(st) SKM_sk_free(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_num(st) SKM_sk_num(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_value(st, i) SKM_sk_value(CONF_IMODULE, (st), (i)) +#define sk_CONF_IMODULE_set(st, i, val) SKM_sk_set(CONF_IMODULE, (st), (i), (val)) +#define sk_CONF_IMODULE_zero(st) SKM_sk_zero(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_push(st, val) SKM_sk_push(CONF_IMODULE, (st), (val)) +#define sk_CONF_IMODULE_unshift(st, val) SKM_sk_unshift(CONF_IMODULE, (st), (val)) +#define sk_CONF_IMODULE_find(st, val) SKM_sk_find(CONF_IMODULE, (st), (val)) +#define sk_CONF_IMODULE_find_ex(st, val) SKM_sk_find_ex(CONF_IMODULE, (st), (val)) +#define sk_CONF_IMODULE_delete(st, i) SKM_sk_delete(CONF_IMODULE, (st), (i)) +#define sk_CONF_IMODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_IMODULE, (st), (ptr)) +#define sk_CONF_IMODULE_insert(st, val, i) SKM_sk_insert(CONF_IMODULE, (st), (val), (i)) +#define sk_CONF_IMODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_IMODULE, (st), (cmp)) +#define sk_CONF_IMODULE_dup(st) SKM_sk_dup(CONF_IMODULE, st) +#define sk_CONF_IMODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_IMODULE, (st), (free_func)) +#define sk_CONF_IMODULE_shift(st) SKM_sk_shift(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_pop(st) SKM_sk_pop(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_sort(st) SKM_sk_sort(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_is_sorted(st) SKM_sk_is_sorted(CONF_IMODULE, (st)) + +#define sk_CONF_MODULE_new(st) SKM_sk_new(CONF_MODULE, (st)) +#define sk_CONF_MODULE_new_null() SKM_sk_new_null(CONF_MODULE) +#define sk_CONF_MODULE_free(st) SKM_sk_free(CONF_MODULE, (st)) +#define sk_CONF_MODULE_num(st) SKM_sk_num(CONF_MODULE, (st)) +#define sk_CONF_MODULE_value(st, i) SKM_sk_value(CONF_MODULE, (st), (i)) +#define sk_CONF_MODULE_set(st, i, val) SKM_sk_set(CONF_MODULE, (st), (i), (val)) +#define sk_CONF_MODULE_zero(st) SKM_sk_zero(CONF_MODULE, (st)) +#define sk_CONF_MODULE_push(st, val) SKM_sk_push(CONF_MODULE, (st), (val)) +#define sk_CONF_MODULE_unshift(st, val) SKM_sk_unshift(CONF_MODULE, (st), (val)) +#define sk_CONF_MODULE_find(st, val) SKM_sk_find(CONF_MODULE, (st), (val)) +#define sk_CONF_MODULE_find_ex(st, val) SKM_sk_find_ex(CONF_MODULE, (st), (val)) +#define sk_CONF_MODULE_delete(st, i) SKM_sk_delete(CONF_MODULE, (st), (i)) +#define sk_CONF_MODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_MODULE, (st), (ptr)) +#define sk_CONF_MODULE_insert(st, val, i) SKM_sk_insert(CONF_MODULE, (st), (val), (i)) +#define sk_CONF_MODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_MODULE, (st), (cmp)) +#define sk_CONF_MODULE_dup(st) SKM_sk_dup(CONF_MODULE, st) +#define sk_CONF_MODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_MODULE, (st), (free_func)) +#define sk_CONF_MODULE_shift(st) SKM_sk_shift(CONF_MODULE, (st)) +#define sk_CONF_MODULE_pop(st) SKM_sk_pop(CONF_MODULE, (st)) +#define sk_CONF_MODULE_sort(st) SKM_sk_sort(CONF_MODULE, (st)) +#define sk_CONF_MODULE_is_sorted(st) SKM_sk_is_sorted(CONF_MODULE, (st)) + +#define sk_CONF_VALUE_new(st) SKM_sk_new(CONF_VALUE, (st)) +#define sk_CONF_VALUE_new_null() SKM_sk_new_null(CONF_VALUE) +#define sk_CONF_VALUE_free(st) SKM_sk_free(CONF_VALUE, (st)) +#define sk_CONF_VALUE_num(st) SKM_sk_num(CONF_VALUE, (st)) +#define sk_CONF_VALUE_value(st, i) SKM_sk_value(CONF_VALUE, (st), (i)) +#define sk_CONF_VALUE_set(st, i, val) SKM_sk_set(CONF_VALUE, (st), (i), (val)) +#define sk_CONF_VALUE_zero(st) SKM_sk_zero(CONF_VALUE, (st)) +#define sk_CONF_VALUE_push(st, val) SKM_sk_push(CONF_VALUE, (st), (val)) +#define sk_CONF_VALUE_unshift(st, val) SKM_sk_unshift(CONF_VALUE, (st), (val)) +#define sk_CONF_VALUE_find(st, val) SKM_sk_find(CONF_VALUE, (st), (val)) +#define sk_CONF_VALUE_find_ex(st, val) SKM_sk_find_ex(CONF_VALUE, (st), (val)) +#define sk_CONF_VALUE_delete(st, i) SKM_sk_delete(CONF_VALUE, (st), (i)) +#define sk_CONF_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_VALUE, (st), (ptr)) +#define sk_CONF_VALUE_insert(st, val, i) SKM_sk_insert(CONF_VALUE, (st), (val), (i)) +#define sk_CONF_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_VALUE, (st), (cmp)) +#define sk_CONF_VALUE_dup(st) SKM_sk_dup(CONF_VALUE, st) +#define sk_CONF_VALUE_pop_free(st, free_func) SKM_sk_pop_free(CONF_VALUE, (st), (free_func)) +#define sk_CONF_VALUE_shift(st) SKM_sk_shift(CONF_VALUE, (st)) +#define sk_CONF_VALUE_pop(st) SKM_sk_pop(CONF_VALUE, (st)) +#define sk_CONF_VALUE_sort(st) SKM_sk_sort(CONF_VALUE, (st)) +#define sk_CONF_VALUE_is_sorted(st) SKM_sk_is_sorted(CONF_VALUE, (st)) + +#define sk_CRYPTO_EX_DATA_FUNCS_new(st) SKM_sk_new(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_new_null() SKM_sk_new_null(CRYPTO_EX_DATA_FUNCS) +#define sk_CRYPTO_EX_DATA_FUNCS_free(st) SKM_sk_free(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_num(st) SKM_sk_num(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_value(st, i) SKM_sk_value(CRYPTO_EX_DATA_FUNCS, (st), (i)) +#define sk_CRYPTO_EX_DATA_FUNCS_set(st, i, val) SKM_sk_set(CRYPTO_EX_DATA_FUNCS, (st), (i), (val)) +#define sk_CRYPTO_EX_DATA_FUNCS_zero(st) SKM_sk_zero(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_push(st, val) SKM_sk_push(CRYPTO_EX_DATA_FUNCS, (st), (val)) +#define sk_CRYPTO_EX_DATA_FUNCS_unshift(st, val) SKM_sk_unshift(CRYPTO_EX_DATA_FUNCS, (st), (val)) +#define sk_CRYPTO_EX_DATA_FUNCS_find(st, val) SKM_sk_find(CRYPTO_EX_DATA_FUNCS, (st), (val)) +#define sk_CRYPTO_EX_DATA_FUNCS_find_ex(st, val) SKM_sk_find_ex(CRYPTO_EX_DATA_FUNCS, (st), (val)) +#define sk_CRYPTO_EX_DATA_FUNCS_delete(st, i) SKM_sk_delete(CRYPTO_EX_DATA_FUNCS, (st), (i)) +#define sk_CRYPTO_EX_DATA_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_EX_DATA_FUNCS, (st), (ptr)) +#define sk_CRYPTO_EX_DATA_FUNCS_insert(st, val, i) SKM_sk_insert(CRYPTO_EX_DATA_FUNCS, (st), (val), (i)) +#define sk_CRYPTO_EX_DATA_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_EX_DATA_FUNCS, (st), (cmp)) +#define sk_CRYPTO_EX_DATA_FUNCS_dup(st) SKM_sk_dup(CRYPTO_EX_DATA_FUNCS, st) +#define sk_CRYPTO_EX_DATA_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_EX_DATA_FUNCS, (st), (free_func)) +#define sk_CRYPTO_EX_DATA_FUNCS_shift(st) SKM_sk_shift(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_pop(st) SKM_sk_pop(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_sort(st) SKM_sk_sort(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_is_sorted(st) SKM_sk_is_sorted(CRYPTO_EX_DATA_FUNCS, (st)) + +#define sk_CRYPTO_dynlock_new(st) SKM_sk_new(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_new_null() SKM_sk_new_null(CRYPTO_dynlock) +#define sk_CRYPTO_dynlock_free(st) SKM_sk_free(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_num(st) SKM_sk_num(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_value(st, i) SKM_sk_value(CRYPTO_dynlock, (st), (i)) +#define sk_CRYPTO_dynlock_set(st, i, val) SKM_sk_set(CRYPTO_dynlock, (st), (i), (val)) +#define sk_CRYPTO_dynlock_zero(st) SKM_sk_zero(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_push(st, val) SKM_sk_push(CRYPTO_dynlock, (st), (val)) +#define sk_CRYPTO_dynlock_unshift(st, val) SKM_sk_unshift(CRYPTO_dynlock, (st), (val)) +#define sk_CRYPTO_dynlock_find(st, val) SKM_sk_find(CRYPTO_dynlock, (st), (val)) +#define sk_CRYPTO_dynlock_find_ex(st, val) SKM_sk_find_ex(CRYPTO_dynlock, (st), (val)) +#define sk_CRYPTO_dynlock_delete(st, i) SKM_sk_delete(CRYPTO_dynlock, (st), (i)) +#define sk_CRYPTO_dynlock_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_dynlock, (st), (ptr)) +#define sk_CRYPTO_dynlock_insert(st, val, i) SKM_sk_insert(CRYPTO_dynlock, (st), (val), (i)) +#define sk_CRYPTO_dynlock_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_dynlock, (st), (cmp)) +#define sk_CRYPTO_dynlock_dup(st) SKM_sk_dup(CRYPTO_dynlock, st) +#define sk_CRYPTO_dynlock_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_dynlock, (st), (free_func)) +#define sk_CRYPTO_dynlock_shift(st) SKM_sk_shift(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_pop(st) SKM_sk_pop(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_sort(st) SKM_sk_sort(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_is_sorted(st) SKM_sk_is_sorted(CRYPTO_dynlock, (st)) + +#define sk_DIST_POINT_new(st) SKM_sk_new(DIST_POINT, (st)) +#define sk_DIST_POINT_new_null() SKM_sk_new_null(DIST_POINT) +#define sk_DIST_POINT_free(st) SKM_sk_free(DIST_POINT, (st)) +#define sk_DIST_POINT_num(st) SKM_sk_num(DIST_POINT, (st)) +#define sk_DIST_POINT_value(st, i) SKM_sk_value(DIST_POINT, (st), (i)) +#define sk_DIST_POINT_set(st, i, val) SKM_sk_set(DIST_POINT, (st), (i), (val)) +#define sk_DIST_POINT_zero(st) SKM_sk_zero(DIST_POINT, (st)) +#define sk_DIST_POINT_push(st, val) SKM_sk_push(DIST_POINT, (st), (val)) +#define sk_DIST_POINT_unshift(st, val) SKM_sk_unshift(DIST_POINT, (st), (val)) +#define sk_DIST_POINT_find(st, val) SKM_sk_find(DIST_POINT, (st), (val)) +#define sk_DIST_POINT_find_ex(st, val) SKM_sk_find_ex(DIST_POINT, (st), (val)) +#define sk_DIST_POINT_delete(st, i) SKM_sk_delete(DIST_POINT, (st), (i)) +#define sk_DIST_POINT_delete_ptr(st, ptr) SKM_sk_delete_ptr(DIST_POINT, (st), (ptr)) +#define sk_DIST_POINT_insert(st, val, i) SKM_sk_insert(DIST_POINT, (st), (val), (i)) +#define sk_DIST_POINT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(DIST_POINT, (st), (cmp)) +#define sk_DIST_POINT_dup(st) SKM_sk_dup(DIST_POINT, st) +#define sk_DIST_POINT_pop_free(st, free_func) SKM_sk_pop_free(DIST_POINT, (st), (free_func)) +#define sk_DIST_POINT_shift(st) SKM_sk_shift(DIST_POINT, (st)) +#define sk_DIST_POINT_pop(st) SKM_sk_pop(DIST_POINT, (st)) +#define sk_DIST_POINT_sort(st) SKM_sk_sort(DIST_POINT, (st)) +#define sk_DIST_POINT_is_sorted(st) SKM_sk_is_sorted(DIST_POINT, (st)) + +#define sk_ENGINE_new(st) SKM_sk_new(ENGINE, (st)) +#define sk_ENGINE_new_null() SKM_sk_new_null(ENGINE) +#define sk_ENGINE_free(st) SKM_sk_free(ENGINE, (st)) +#define sk_ENGINE_num(st) SKM_sk_num(ENGINE, (st)) +#define sk_ENGINE_value(st, i) SKM_sk_value(ENGINE, (st), (i)) +#define sk_ENGINE_set(st, i, val) SKM_sk_set(ENGINE, (st), (i), (val)) +#define sk_ENGINE_zero(st) SKM_sk_zero(ENGINE, (st)) +#define sk_ENGINE_push(st, val) SKM_sk_push(ENGINE, (st), (val)) +#define sk_ENGINE_unshift(st, val) SKM_sk_unshift(ENGINE, (st), (val)) +#define sk_ENGINE_find(st, val) SKM_sk_find(ENGINE, (st), (val)) +#define sk_ENGINE_find_ex(st, val) SKM_sk_find_ex(ENGINE, (st), (val)) +#define sk_ENGINE_delete(st, i) SKM_sk_delete(ENGINE, (st), (i)) +#define sk_ENGINE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE, (st), (ptr)) +#define sk_ENGINE_insert(st, val, i) SKM_sk_insert(ENGINE, (st), (val), (i)) +#define sk_ENGINE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE, (st), (cmp)) +#define sk_ENGINE_dup(st) SKM_sk_dup(ENGINE, st) +#define sk_ENGINE_pop_free(st, free_func) SKM_sk_pop_free(ENGINE, (st), (free_func)) +#define sk_ENGINE_shift(st) SKM_sk_shift(ENGINE, (st)) +#define sk_ENGINE_pop(st) SKM_sk_pop(ENGINE, (st)) +#define sk_ENGINE_sort(st) SKM_sk_sort(ENGINE, (st)) +#define sk_ENGINE_is_sorted(st) SKM_sk_is_sorted(ENGINE, (st)) + +#define sk_ENGINE_CLEANUP_ITEM_new(st) SKM_sk_new(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_new_null() SKM_sk_new_null(ENGINE_CLEANUP_ITEM) +#define sk_ENGINE_CLEANUP_ITEM_free(st) SKM_sk_free(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_num(st) SKM_sk_num(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_value(st, i) SKM_sk_value(ENGINE_CLEANUP_ITEM, (st), (i)) +#define sk_ENGINE_CLEANUP_ITEM_set(st, i, val) SKM_sk_set(ENGINE_CLEANUP_ITEM, (st), (i), (val)) +#define sk_ENGINE_CLEANUP_ITEM_zero(st) SKM_sk_zero(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_push(st, val) SKM_sk_push(ENGINE_CLEANUP_ITEM, (st), (val)) +#define sk_ENGINE_CLEANUP_ITEM_unshift(st, val) SKM_sk_unshift(ENGINE_CLEANUP_ITEM, (st), (val)) +#define sk_ENGINE_CLEANUP_ITEM_find(st, val) SKM_sk_find(ENGINE_CLEANUP_ITEM, (st), (val)) +#define sk_ENGINE_CLEANUP_ITEM_find_ex(st, val) SKM_sk_find_ex(ENGINE_CLEANUP_ITEM, (st), (val)) +#define sk_ENGINE_CLEANUP_ITEM_delete(st, i) SKM_sk_delete(ENGINE_CLEANUP_ITEM, (st), (i)) +#define sk_ENGINE_CLEANUP_ITEM_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE_CLEANUP_ITEM, (st), (ptr)) +#define sk_ENGINE_CLEANUP_ITEM_insert(st, val, i) SKM_sk_insert(ENGINE_CLEANUP_ITEM, (st), (val), (i)) +#define sk_ENGINE_CLEANUP_ITEM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE_CLEANUP_ITEM, (st), (cmp)) +#define sk_ENGINE_CLEANUP_ITEM_dup(st) SKM_sk_dup(ENGINE_CLEANUP_ITEM, st) +#define sk_ENGINE_CLEANUP_ITEM_pop_free(st, free_func) SKM_sk_pop_free(ENGINE_CLEANUP_ITEM, (st), (free_func)) +#define sk_ENGINE_CLEANUP_ITEM_shift(st) SKM_sk_shift(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_pop(st) SKM_sk_pop(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_sort(st) SKM_sk_sort(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_is_sorted(st) SKM_sk_is_sorted(ENGINE_CLEANUP_ITEM, (st)) + +#define sk_GENERAL_NAME_new(st) SKM_sk_new(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_new_null() SKM_sk_new_null(GENERAL_NAME) +#define sk_GENERAL_NAME_free(st) SKM_sk_free(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_num(st) SKM_sk_num(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_value(st, i) SKM_sk_value(GENERAL_NAME, (st), (i)) +#define sk_GENERAL_NAME_set(st, i, val) SKM_sk_set(GENERAL_NAME, (st), (i), (val)) +#define sk_GENERAL_NAME_zero(st) SKM_sk_zero(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_push(st, val) SKM_sk_push(GENERAL_NAME, (st), (val)) +#define sk_GENERAL_NAME_unshift(st, val) SKM_sk_unshift(GENERAL_NAME, (st), (val)) +#define sk_GENERAL_NAME_find(st, val) SKM_sk_find(GENERAL_NAME, (st), (val)) +#define sk_GENERAL_NAME_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAME, (st), (val)) +#define sk_GENERAL_NAME_delete(st, i) SKM_sk_delete(GENERAL_NAME, (st), (i)) +#define sk_GENERAL_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAME, (st), (ptr)) +#define sk_GENERAL_NAME_insert(st, val, i) SKM_sk_insert(GENERAL_NAME, (st), (val), (i)) +#define sk_GENERAL_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAME, (st), (cmp)) +#define sk_GENERAL_NAME_dup(st) SKM_sk_dup(GENERAL_NAME, st) +#define sk_GENERAL_NAME_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAME, (st), (free_func)) +#define sk_GENERAL_NAME_shift(st) SKM_sk_shift(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_pop(st) SKM_sk_pop(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_sort(st) SKM_sk_sort(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAME, (st)) + +#define sk_GENERAL_SUBTREE_new(st) SKM_sk_new(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_new_null() SKM_sk_new_null(GENERAL_SUBTREE) +#define sk_GENERAL_SUBTREE_free(st) SKM_sk_free(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_num(st) SKM_sk_num(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_value(st, i) SKM_sk_value(GENERAL_SUBTREE, (st), (i)) +#define sk_GENERAL_SUBTREE_set(st, i, val) SKM_sk_set(GENERAL_SUBTREE, (st), (i), (val)) +#define sk_GENERAL_SUBTREE_zero(st) SKM_sk_zero(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_push(st, val) SKM_sk_push(GENERAL_SUBTREE, (st), (val)) +#define sk_GENERAL_SUBTREE_unshift(st, val) SKM_sk_unshift(GENERAL_SUBTREE, (st), (val)) +#define sk_GENERAL_SUBTREE_find(st, val) SKM_sk_find(GENERAL_SUBTREE, (st), (val)) +#define sk_GENERAL_SUBTREE_find_ex(st, val) SKM_sk_find_ex(GENERAL_SUBTREE, (st), (val)) +#define sk_GENERAL_SUBTREE_delete(st, i) SKM_sk_delete(GENERAL_SUBTREE, (st), (i)) +#define sk_GENERAL_SUBTREE_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_SUBTREE, (st), (ptr)) +#define sk_GENERAL_SUBTREE_insert(st, val, i) SKM_sk_insert(GENERAL_SUBTREE, (st), (val), (i)) +#define sk_GENERAL_SUBTREE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_SUBTREE, (st), (cmp)) +#define sk_GENERAL_SUBTREE_dup(st) SKM_sk_dup(GENERAL_SUBTREE, st) +#define sk_GENERAL_SUBTREE_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_SUBTREE, (st), (free_func)) +#define sk_GENERAL_SUBTREE_shift(st) SKM_sk_shift(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_pop(st) SKM_sk_pop(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_sort(st) SKM_sk_sort(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_is_sorted(st) SKM_sk_is_sorted(GENERAL_SUBTREE, (st)) + +#define sk_IPAddressFamily_new(st) SKM_sk_new(IPAddressFamily, (st)) +#define sk_IPAddressFamily_new_null() SKM_sk_new_null(IPAddressFamily) +#define sk_IPAddressFamily_free(st) SKM_sk_free(IPAddressFamily, (st)) +#define sk_IPAddressFamily_num(st) SKM_sk_num(IPAddressFamily, (st)) +#define sk_IPAddressFamily_value(st, i) SKM_sk_value(IPAddressFamily, (st), (i)) +#define sk_IPAddressFamily_set(st, i, val) SKM_sk_set(IPAddressFamily, (st), (i), (val)) +#define sk_IPAddressFamily_zero(st) SKM_sk_zero(IPAddressFamily, (st)) +#define sk_IPAddressFamily_push(st, val) SKM_sk_push(IPAddressFamily, (st), (val)) +#define sk_IPAddressFamily_unshift(st, val) SKM_sk_unshift(IPAddressFamily, (st), (val)) +#define sk_IPAddressFamily_find(st, val) SKM_sk_find(IPAddressFamily, (st), (val)) +#define sk_IPAddressFamily_find_ex(st, val) SKM_sk_find_ex(IPAddressFamily, (st), (val)) +#define sk_IPAddressFamily_delete(st, i) SKM_sk_delete(IPAddressFamily, (st), (i)) +#define sk_IPAddressFamily_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressFamily, (st), (ptr)) +#define sk_IPAddressFamily_insert(st, val, i) SKM_sk_insert(IPAddressFamily, (st), (val), (i)) +#define sk_IPAddressFamily_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressFamily, (st), (cmp)) +#define sk_IPAddressFamily_dup(st) SKM_sk_dup(IPAddressFamily, st) +#define sk_IPAddressFamily_pop_free(st, free_func) SKM_sk_pop_free(IPAddressFamily, (st), (free_func)) +#define sk_IPAddressFamily_shift(st) SKM_sk_shift(IPAddressFamily, (st)) +#define sk_IPAddressFamily_pop(st) SKM_sk_pop(IPAddressFamily, (st)) +#define sk_IPAddressFamily_sort(st) SKM_sk_sort(IPAddressFamily, (st)) +#define sk_IPAddressFamily_is_sorted(st) SKM_sk_is_sorted(IPAddressFamily, (st)) + +#define sk_IPAddressOrRange_new(st) SKM_sk_new(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_new_null() SKM_sk_new_null(IPAddressOrRange) +#define sk_IPAddressOrRange_free(st) SKM_sk_free(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_num(st) SKM_sk_num(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_value(st, i) SKM_sk_value(IPAddressOrRange, (st), (i)) +#define sk_IPAddressOrRange_set(st, i, val) SKM_sk_set(IPAddressOrRange, (st), (i), (val)) +#define sk_IPAddressOrRange_zero(st) SKM_sk_zero(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_push(st, val) SKM_sk_push(IPAddressOrRange, (st), (val)) +#define sk_IPAddressOrRange_unshift(st, val) SKM_sk_unshift(IPAddressOrRange, (st), (val)) +#define sk_IPAddressOrRange_find(st, val) SKM_sk_find(IPAddressOrRange, (st), (val)) +#define sk_IPAddressOrRange_find_ex(st, val) SKM_sk_find_ex(IPAddressOrRange, (st), (val)) +#define sk_IPAddressOrRange_delete(st, i) SKM_sk_delete(IPAddressOrRange, (st), (i)) +#define sk_IPAddressOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressOrRange, (st), (ptr)) +#define sk_IPAddressOrRange_insert(st, val, i) SKM_sk_insert(IPAddressOrRange, (st), (val), (i)) +#define sk_IPAddressOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressOrRange, (st), (cmp)) +#define sk_IPAddressOrRange_dup(st) SKM_sk_dup(IPAddressOrRange, st) +#define sk_IPAddressOrRange_pop_free(st, free_func) SKM_sk_pop_free(IPAddressOrRange, (st), (free_func)) +#define sk_IPAddressOrRange_shift(st) SKM_sk_shift(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_pop(st) SKM_sk_pop(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_sort(st) SKM_sk_sort(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_is_sorted(st) SKM_sk_is_sorted(IPAddressOrRange, (st)) + +#define sk_KRB5_APREQBODY_new(st) SKM_sk_new(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_new_null() SKM_sk_new_null(KRB5_APREQBODY) +#define sk_KRB5_APREQBODY_free(st) SKM_sk_free(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_num(st) SKM_sk_num(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_value(st, i) SKM_sk_value(KRB5_APREQBODY, (st), (i)) +#define sk_KRB5_APREQBODY_set(st, i, val) SKM_sk_set(KRB5_APREQBODY, (st), (i), (val)) +#define sk_KRB5_APREQBODY_zero(st) SKM_sk_zero(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_push(st, val) SKM_sk_push(KRB5_APREQBODY, (st), (val)) +#define sk_KRB5_APREQBODY_unshift(st, val) SKM_sk_unshift(KRB5_APREQBODY, (st), (val)) +#define sk_KRB5_APREQBODY_find(st, val) SKM_sk_find(KRB5_APREQBODY, (st), (val)) +#define sk_KRB5_APREQBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_APREQBODY, (st), (val)) +#define sk_KRB5_APREQBODY_delete(st, i) SKM_sk_delete(KRB5_APREQBODY, (st), (i)) +#define sk_KRB5_APREQBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_APREQBODY, (st), (ptr)) +#define sk_KRB5_APREQBODY_insert(st, val, i) SKM_sk_insert(KRB5_APREQBODY, (st), (val), (i)) +#define sk_KRB5_APREQBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_APREQBODY, (st), (cmp)) +#define sk_KRB5_APREQBODY_dup(st) SKM_sk_dup(KRB5_APREQBODY, st) +#define sk_KRB5_APREQBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_APREQBODY, (st), (free_func)) +#define sk_KRB5_APREQBODY_shift(st) SKM_sk_shift(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_pop(st) SKM_sk_pop(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_sort(st) SKM_sk_sort(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_APREQBODY, (st)) + +#define sk_KRB5_AUTHDATA_new(st) SKM_sk_new(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_new_null() SKM_sk_new_null(KRB5_AUTHDATA) +#define sk_KRB5_AUTHDATA_free(st) SKM_sk_free(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_num(st) SKM_sk_num(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_value(st, i) SKM_sk_value(KRB5_AUTHDATA, (st), (i)) +#define sk_KRB5_AUTHDATA_set(st, i, val) SKM_sk_set(KRB5_AUTHDATA, (st), (i), (val)) +#define sk_KRB5_AUTHDATA_zero(st) SKM_sk_zero(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_push(st, val) SKM_sk_push(KRB5_AUTHDATA, (st), (val)) +#define sk_KRB5_AUTHDATA_unshift(st, val) SKM_sk_unshift(KRB5_AUTHDATA, (st), (val)) +#define sk_KRB5_AUTHDATA_find(st, val) SKM_sk_find(KRB5_AUTHDATA, (st), (val)) +#define sk_KRB5_AUTHDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHDATA, (st), (val)) +#define sk_KRB5_AUTHDATA_delete(st, i) SKM_sk_delete(KRB5_AUTHDATA, (st), (i)) +#define sk_KRB5_AUTHDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHDATA, (st), (ptr)) +#define sk_KRB5_AUTHDATA_insert(st, val, i) SKM_sk_insert(KRB5_AUTHDATA, (st), (val), (i)) +#define sk_KRB5_AUTHDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHDATA, (st), (cmp)) +#define sk_KRB5_AUTHDATA_dup(st) SKM_sk_dup(KRB5_AUTHDATA, st) +#define sk_KRB5_AUTHDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHDATA, (st), (free_func)) +#define sk_KRB5_AUTHDATA_shift(st) SKM_sk_shift(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_pop(st) SKM_sk_pop(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_sort(st) SKM_sk_sort(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHDATA, (st)) + +#define sk_KRB5_AUTHENTBODY_new(st) SKM_sk_new(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_new_null() SKM_sk_new_null(KRB5_AUTHENTBODY) +#define sk_KRB5_AUTHENTBODY_free(st) SKM_sk_free(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_num(st) SKM_sk_num(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_value(st, i) SKM_sk_value(KRB5_AUTHENTBODY, (st), (i)) +#define sk_KRB5_AUTHENTBODY_set(st, i, val) SKM_sk_set(KRB5_AUTHENTBODY, (st), (i), (val)) +#define sk_KRB5_AUTHENTBODY_zero(st) SKM_sk_zero(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_push(st, val) SKM_sk_push(KRB5_AUTHENTBODY, (st), (val)) +#define sk_KRB5_AUTHENTBODY_unshift(st, val) SKM_sk_unshift(KRB5_AUTHENTBODY, (st), (val)) +#define sk_KRB5_AUTHENTBODY_find(st, val) SKM_sk_find(KRB5_AUTHENTBODY, (st), (val)) +#define sk_KRB5_AUTHENTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHENTBODY, (st), (val)) +#define sk_KRB5_AUTHENTBODY_delete(st, i) SKM_sk_delete(KRB5_AUTHENTBODY, (st), (i)) +#define sk_KRB5_AUTHENTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHENTBODY, (st), (ptr)) +#define sk_KRB5_AUTHENTBODY_insert(st, val, i) SKM_sk_insert(KRB5_AUTHENTBODY, (st), (val), (i)) +#define sk_KRB5_AUTHENTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHENTBODY, (st), (cmp)) +#define sk_KRB5_AUTHENTBODY_dup(st) SKM_sk_dup(KRB5_AUTHENTBODY, st) +#define sk_KRB5_AUTHENTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHENTBODY, (st), (free_func)) +#define sk_KRB5_AUTHENTBODY_shift(st) SKM_sk_shift(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_pop(st) SKM_sk_pop(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_sort(st) SKM_sk_sort(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHENTBODY, (st)) + +#define sk_KRB5_CHECKSUM_new(st) SKM_sk_new(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_new_null() SKM_sk_new_null(KRB5_CHECKSUM) +#define sk_KRB5_CHECKSUM_free(st) SKM_sk_free(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_num(st) SKM_sk_num(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_value(st, i) SKM_sk_value(KRB5_CHECKSUM, (st), (i)) +#define sk_KRB5_CHECKSUM_set(st, i, val) SKM_sk_set(KRB5_CHECKSUM, (st), (i), (val)) +#define sk_KRB5_CHECKSUM_zero(st) SKM_sk_zero(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_push(st, val) SKM_sk_push(KRB5_CHECKSUM, (st), (val)) +#define sk_KRB5_CHECKSUM_unshift(st, val) SKM_sk_unshift(KRB5_CHECKSUM, (st), (val)) +#define sk_KRB5_CHECKSUM_find(st, val) SKM_sk_find(KRB5_CHECKSUM, (st), (val)) +#define sk_KRB5_CHECKSUM_find_ex(st, val) SKM_sk_find_ex(KRB5_CHECKSUM, (st), (val)) +#define sk_KRB5_CHECKSUM_delete(st, i) SKM_sk_delete(KRB5_CHECKSUM, (st), (i)) +#define sk_KRB5_CHECKSUM_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_CHECKSUM, (st), (ptr)) +#define sk_KRB5_CHECKSUM_insert(st, val, i) SKM_sk_insert(KRB5_CHECKSUM, (st), (val), (i)) +#define sk_KRB5_CHECKSUM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_CHECKSUM, (st), (cmp)) +#define sk_KRB5_CHECKSUM_dup(st) SKM_sk_dup(KRB5_CHECKSUM, st) +#define sk_KRB5_CHECKSUM_pop_free(st, free_func) SKM_sk_pop_free(KRB5_CHECKSUM, (st), (free_func)) +#define sk_KRB5_CHECKSUM_shift(st) SKM_sk_shift(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_pop(st) SKM_sk_pop(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_sort(st) SKM_sk_sort(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_is_sorted(st) SKM_sk_is_sorted(KRB5_CHECKSUM, (st)) + +#define sk_KRB5_ENCDATA_new(st) SKM_sk_new(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_new_null() SKM_sk_new_null(KRB5_ENCDATA) +#define sk_KRB5_ENCDATA_free(st) SKM_sk_free(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_num(st) SKM_sk_num(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_value(st, i) SKM_sk_value(KRB5_ENCDATA, (st), (i)) +#define sk_KRB5_ENCDATA_set(st, i, val) SKM_sk_set(KRB5_ENCDATA, (st), (i), (val)) +#define sk_KRB5_ENCDATA_zero(st) SKM_sk_zero(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_push(st, val) SKM_sk_push(KRB5_ENCDATA, (st), (val)) +#define sk_KRB5_ENCDATA_unshift(st, val) SKM_sk_unshift(KRB5_ENCDATA, (st), (val)) +#define sk_KRB5_ENCDATA_find(st, val) SKM_sk_find(KRB5_ENCDATA, (st), (val)) +#define sk_KRB5_ENCDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCDATA, (st), (val)) +#define sk_KRB5_ENCDATA_delete(st, i) SKM_sk_delete(KRB5_ENCDATA, (st), (i)) +#define sk_KRB5_ENCDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCDATA, (st), (ptr)) +#define sk_KRB5_ENCDATA_insert(st, val, i) SKM_sk_insert(KRB5_ENCDATA, (st), (val), (i)) +#define sk_KRB5_ENCDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCDATA, (st), (cmp)) +#define sk_KRB5_ENCDATA_dup(st) SKM_sk_dup(KRB5_ENCDATA, st) +#define sk_KRB5_ENCDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCDATA, (st), (free_func)) +#define sk_KRB5_ENCDATA_shift(st) SKM_sk_shift(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_pop(st) SKM_sk_pop(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_sort(st) SKM_sk_sort(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCDATA, (st)) + +#define sk_KRB5_ENCKEY_new(st) SKM_sk_new(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_new_null() SKM_sk_new_null(KRB5_ENCKEY) +#define sk_KRB5_ENCKEY_free(st) SKM_sk_free(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_num(st) SKM_sk_num(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_value(st, i) SKM_sk_value(KRB5_ENCKEY, (st), (i)) +#define sk_KRB5_ENCKEY_set(st, i, val) SKM_sk_set(KRB5_ENCKEY, (st), (i), (val)) +#define sk_KRB5_ENCKEY_zero(st) SKM_sk_zero(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_push(st, val) SKM_sk_push(KRB5_ENCKEY, (st), (val)) +#define sk_KRB5_ENCKEY_unshift(st, val) SKM_sk_unshift(KRB5_ENCKEY, (st), (val)) +#define sk_KRB5_ENCKEY_find(st, val) SKM_sk_find(KRB5_ENCKEY, (st), (val)) +#define sk_KRB5_ENCKEY_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCKEY, (st), (val)) +#define sk_KRB5_ENCKEY_delete(st, i) SKM_sk_delete(KRB5_ENCKEY, (st), (i)) +#define sk_KRB5_ENCKEY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCKEY, (st), (ptr)) +#define sk_KRB5_ENCKEY_insert(st, val, i) SKM_sk_insert(KRB5_ENCKEY, (st), (val), (i)) +#define sk_KRB5_ENCKEY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCKEY, (st), (cmp)) +#define sk_KRB5_ENCKEY_dup(st) SKM_sk_dup(KRB5_ENCKEY, st) +#define sk_KRB5_ENCKEY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCKEY, (st), (free_func)) +#define sk_KRB5_ENCKEY_shift(st) SKM_sk_shift(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_pop(st) SKM_sk_pop(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_sort(st) SKM_sk_sort(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCKEY, (st)) + +#define sk_KRB5_PRINCNAME_new(st) SKM_sk_new(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_new_null() SKM_sk_new_null(KRB5_PRINCNAME) +#define sk_KRB5_PRINCNAME_free(st) SKM_sk_free(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_num(st) SKM_sk_num(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_value(st, i) SKM_sk_value(KRB5_PRINCNAME, (st), (i)) +#define sk_KRB5_PRINCNAME_set(st, i, val) SKM_sk_set(KRB5_PRINCNAME, (st), (i), (val)) +#define sk_KRB5_PRINCNAME_zero(st) SKM_sk_zero(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_push(st, val) SKM_sk_push(KRB5_PRINCNAME, (st), (val)) +#define sk_KRB5_PRINCNAME_unshift(st, val) SKM_sk_unshift(KRB5_PRINCNAME, (st), (val)) +#define sk_KRB5_PRINCNAME_find(st, val) SKM_sk_find(KRB5_PRINCNAME, (st), (val)) +#define sk_KRB5_PRINCNAME_find_ex(st, val) SKM_sk_find_ex(KRB5_PRINCNAME, (st), (val)) +#define sk_KRB5_PRINCNAME_delete(st, i) SKM_sk_delete(KRB5_PRINCNAME, (st), (i)) +#define sk_KRB5_PRINCNAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_PRINCNAME, (st), (ptr)) +#define sk_KRB5_PRINCNAME_insert(st, val, i) SKM_sk_insert(KRB5_PRINCNAME, (st), (val), (i)) +#define sk_KRB5_PRINCNAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_PRINCNAME, (st), (cmp)) +#define sk_KRB5_PRINCNAME_dup(st) SKM_sk_dup(KRB5_PRINCNAME, st) +#define sk_KRB5_PRINCNAME_pop_free(st, free_func) SKM_sk_pop_free(KRB5_PRINCNAME, (st), (free_func)) +#define sk_KRB5_PRINCNAME_shift(st) SKM_sk_shift(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_pop(st) SKM_sk_pop(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_sort(st) SKM_sk_sort(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_is_sorted(st) SKM_sk_is_sorted(KRB5_PRINCNAME, (st)) + +#define sk_KRB5_TKTBODY_new(st) SKM_sk_new(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_new_null() SKM_sk_new_null(KRB5_TKTBODY) +#define sk_KRB5_TKTBODY_free(st) SKM_sk_free(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_num(st) SKM_sk_num(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_value(st, i) SKM_sk_value(KRB5_TKTBODY, (st), (i)) +#define sk_KRB5_TKTBODY_set(st, i, val) SKM_sk_set(KRB5_TKTBODY, (st), (i), (val)) +#define sk_KRB5_TKTBODY_zero(st) SKM_sk_zero(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_push(st, val) SKM_sk_push(KRB5_TKTBODY, (st), (val)) +#define sk_KRB5_TKTBODY_unshift(st, val) SKM_sk_unshift(KRB5_TKTBODY, (st), (val)) +#define sk_KRB5_TKTBODY_find(st, val) SKM_sk_find(KRB5_TKTBODY, (st), (val)) +#define sk_KRB5_TKTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_TKTBODY, (st), (val)) +#define sk_KRB5_TKTBODY_delete(st, i) SKM_sk_delete(KRB5_TKTBODY, (st), (i)) +#define sk_KRB5_TKTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_TKTBODY, (st), (ptr)) +#define sk_KRB5_TKTBODY_insert(st, val, i) SKM_sk_insert(KRB5_TKTBODY, (st), (val), (i)) +#define sk_KRB5_TKTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_TKTBODY, (st), (cmp)) +#define sk_KRB5_TKTBODY_dup(st) SKM_sk_dup(KRB5_TKTBODY, st) +#define sk_KRB5_TKTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_TKTBODY, (st), (free_func)) +#define sk_KRB5_TKTBODY_shift(st) SKM_sk_shift(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_pop(st) SKM_sk_pop(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_sort(st) SKM_sk_sort(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_TKTBODY, (st)) + +#define sk_MIME_HEADER_new(st) SKM_sk_new(MIME_HEADER, (st)) +#define sk_MIME_HEADER_new_null() SKM_sk_new_null(MIME_HEADER) +#define sk_MIME_HEADER_free(st) SKM_sk_free(MIME_HEADER, (st)) +#define sk_MIME_HEADER_num(st) SKM_sk_num(MIME_HEADER, (st)) +#define sk_MIME_HEADER_value(st, i) SKM_sk_value(MIME_HEADER, (st), (i)) +#define sk_MIME_HEADER_set(st, i, val) SKM_sk_set(MIME_HEADER, (st), (i), (val)) +#define sk_MIME_HEADER_zero(st) SKM_sk_zero(MIME_HEADER, (st)) +#define sk_MIME_HEADER_push(st, val) SKM_sk_push(MIME_HEADER, (st), (val)) +#define sk_MIME_HEADER_unshift(st, val) SKM_sk_unshift(MIME_HEADER, (st), (val)) +#define sk_MIME_HEADER_find(st, val) SKM_sk_find(MIME_HEADER, (st), (val)) +#define sk_MIME_HEADER_find_ex(st, val) SKM_sk_find_ex(MIME_HEADER, (st), (val)) +#define sk_MIME_HEADER_delete(st, i) SKM_sk_delete(MIME_HEADER, (st), (i)) +#define sk_MIME_HEADER_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_HEADER, (st), (ptr)) +#define sk_MIME_HEADER_insert(st, val, i) SKM_sk_insert(MIME_HEADER, (st), (val), (i)) +#define sk_MIME_HEADER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_HEADER, (st), (cmp)) +#define sk_MIME_HEADER_dup(st) SKM_sk_dup(MIME_HEADER, st) +#define sk_MIME_HEADER_pop_free(st, free_func) SKM_sk_pop_free(MIME_HEADER, (st), (free_func)) +#define sk_MIME_HEADER_shift(st) SKM_sk_shift(MIME_HEADER, (st)) +#define sk_MIME_HEADER_pop(st) SKM_sk_pop(MIME_HEADER, (st)) +#define sk_MIME_HEADER_sort(st) SKM_sk_sort(MIME_HEADER, (st)) +#define sk_MIME_HEADER_is_sorted(st) SKM_sk_is_sorted(MIME_HEADER, (st)) + +#define sk_MIME_PARAM_new(st) SKM_sk_new(MIME_PARAM, (st)) +#define sk_MIME_PARAM_new_null() SKM_sk_new_null(MIME_PARAM) +#define sk_MIME_PARAM_free(st) SKM_sk_free(MIME_PARAM, (st)) +#define sk_MIME_PARAM_num(st) SKM_sk_num(MIME_PARAM, (st)) +#define sk_MIME_PARAM_value(st, i) SKM_sk_value(MIME_PARAM, (st), (i)) +#define sk_MIME_PARAM_set(st, i, val) SKM_sk_set(MIME_PARAM, (st), (i), (val)) +#define sk_MIME_PARAM_zero(st) SKM_sk_zero(MIME_PARAM, (st)) +#define sk_MIME_PARAM_push(st, val) SKM_sk_push(MIME_PARAM, (st), (val)) +#define sk_MIME_PARAM_unshift(st, val) SKM_sk_unshift(MIME_PARAM, (st), (val)) +#define sk_MIME_PARAM_find(st, val) SKM_sk_find(MIME_PARAM, (st), (val)) +#define sk_MIME_PARAM_find_ex(st, val) SKM_sk_find_ex(MIME_PARAM, (st), (val)) +#define sk_MIME_PARAM_delete(st, i) SKM_sk_delete(MIME_PARAM, (st), (i)) +#define sk_MIME_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_PARAM, (st), (ptr)) +#define sk_MIME_PARAM_insert(st, val, i) SKM_sk_insert(MIME_PARAM, (st), (val), (i)) +#define sk_MIME_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_PARAM, (st), (cmp)) +#define sk_MIME_PARAM_dup(st) SKM_sk_dup(MIME_PARAM, st) +#define sk_MIME_PARAM_pop_free(st, free_func) SKM_sk_pop_free(MIME_PARAM, (st), (free_func)) +#define sk_MIME_PARAM_shift(st) SKM_sk_shift(MIME_PARAM, (st)) +#define sk_MIME_PARAM_pop(st) SKM_sk_pop(MIME_PARAM, (st)) +#define sk_MIME_PARAM_sort(st) SKM_sk_sort(MIME_PARAM, (st)) +#define sk_MIME_PARAM_is_sorted(st) SKM_sk_is_sorted(MIME_PARAM, (st)) + +#define sk_NAME_FUNCS_new(st) SKM_sk_new(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_new_null() SKM_sk_new_null(NAME_FUNCS) +#define sk_NAME_FUNCS_free(st) SKM_sk_free(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_num(st) SKM_sk_num(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_value(st, i) SKM_sk_value(NAME_FUNCS, (st), (i)) +#define sk_NAME_FUNCS_set(st, i, val) SKM_sk_set(NAME_FUNCS, (st), (i), (val)) +#define sk_NAME_FUNCS_zero(st) SKM_sk_zero(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_push(st, val) SKM_sk_push(NAME_FUNCS, (st), (val)) +#define sk_NAME_FUNCS_unshift(st, val) SKM_sk_unshift(NAME_FUNCS, (st), (val)) +#define sk_NAME_FUNCS_find(st, val) SKM_sk_find(NAME_FUNCS, (st), (val)) +#define sk_NAME_FUNCS_find_ex(st, val) SKM_sk_find_ex(NAME_FUNCS, (st), (val)) +#define sk_NAME_FUNCS_delete(st, i) SKM_sk_delete(NAME_FUNCS, (st), (i)) +#define sk_NAME_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(NAME_FUNCS, (st), (ptr)) +#define sk_NAME_FUNCS_insert(st, val, i) SKM_sk_insert(NAME_FUNCS, (st), (val), (i)) +#define sk_NAME_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(NAME_FUNCS, (st), (cmp)) +#define sk_NAME_FUNCS_dup(st) SKM_sk_dup(NAME_FUNCS, st) +#define sk_NAME_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(NAME_FUNCS, (st), (free_func)) +#define sk_NAME_FUNCS_shift(st) SKM_sk_shift(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_pop(st) SKM_sk_pop(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_sort(st) SKM_sk_sort(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_is_sorted(st) SKM_sk_is_sorted(NAME_FUNCS, (st)) + +#define sk_OCSP_CERTID_new(st) SKM_sk_new(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_new_null() SKM_sk_new_null(OCSP_CERTID) +#define sk_OCSP_CERTID_free(st) SKM_sk_free(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_num(st) SKM_sk_num(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_value(st, i) SKM_sk_value(OCSP_CERTID, (st), (i)) +#define sk_OCSP_CERTID_set(st, i, val) SKM_sk_set(OCSP_CERTID, (st), (i), (val)) +#define sk_OCSP_CERTID_zero(st) SKM_sk_zero(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_push(st, val) SKM_sk_push(OCSP_CERTID, (st), (val)) +#define sk_OCSP_CERTID_unshift(st, val) SKM_sk_unshift(OCSP_CERTID, (st), (val)) +#define sk_OCSP_CERTID_find(st, val) SKM_sk_find(OCSP_CERTID, (st), (val)) +#define sk_OCSP_CERTID_find_ex(st, val) SKM_sk_find_ex(OCSP_CERTID, (st), (val)) +#define sk_OCSP_CERTID_delete(st, i) SKM_sk_delete(OCSP_CERTID, (st), (i)) +#define sk_OCSP_CERTID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_CERTID, (st), (ptr)) +#define sk_OCSP_CERTID_insert(st, val, i) SKM_sk_insert(OCSP_CERTID, (st), (val), (i)) +#define sk_OCSP_CERTID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_CERTID, (st), (cmp)) +#define sk_OCSP_CERTID_dup(st) SKM_sk_dup(OCSP_CERTID, st) +#define sk_OCSP_CERTID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_CERTID, (st), (free_func)) +#define sk_OCSP_CERTID_shift(st) SKM_sk_shift(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_pop(st) SKM_sk_pop(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_sort(st) SKM_sk_sort(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_is_sorted(st) SKM_sk_is_sorted(OCSP_CERTID, (st)) + +#define sk_OCSP_ONEREQ_new(st) SKM_sk_new(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_new_null() SKM_sk_new_null(OCSP_ONEREQ) +#define sk_OCSP_ONEREQ_free(st) SKM_sk_free(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_num(st) SKM_sk_num(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_value(st, i) SKM_sk_value(OCSP_ONEREQ, (st), (i)) +#define sk_OCSP_ONEREQ_set(st, i, val) SKM_sk_set(OCSP_ONEREQ, (st), (i), (val)) +#define sk_OCSP_ONEREQ_zero(st) SKM_sk_zero(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_push(st, val) SKM_sk_push(OCSP_ONEREQ, (st), (val)) +#define sk_OCSP_ONEREQ_unshift(st, val) SKM_sk_unshift(OCSP_ONEREQ, (st), (val)) +#define sk_OCSP_ONEREQ_find(st, val) SKM_sk_find(OCSP_ONEREQ, (st), (val)) +#define sk_OCSP_ONEREQ_find_ex(st, val) SKM_sk_find_ex(OCSP_ONEREQ, (st), (val)) +#define sk_OCSP_ONEREQ_delete(st, i) SKM_sk_delete(OCSP_ONEREQ, (st), (i)) +#define sk_OCSP_ONEREQ_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_ONEREQ, (st), (ptr)) +#define sk_OCSP_ONEREQ_insert(st, val, i) SKM_sk_insert(OCSP_ONEREQ, (st), (val), (i)) +#define sk_OCSP_ONEREQ_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_ONEREQ, (st), (cmp)) +#define sk_OCSP_ONEREQ_dup(st) SKM_sk_dup(OCSP_ONEREQ, st) +#define sk_OCSP_ONEREQ_pop_free(st, free_func) SKM_sk_pop_free(OCSP_ONEREQ, (st), (free_func)) +#define sk_OCSP_ONEREQ_shift(st) SKM_sk_shift(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_pop(st) SKM_sk_pop(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_sort(st) SKM_sk_sort(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_is_sorted(st) SKM_sk_is_sorted(OCSP_ONEREQ, (st)) + +#define sk_OCSP_SINGLERESP_new(st) SKM_sk_new(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_new_null() SKM_sk_new_null(OCSP_SINGLERESP) +#define sk_OCSP_SINGLERESP_free(st) SKM_sk_free(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_num(st) SKM_sk_num(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_value(st, i) SKM_sk_value(OCSP_SINGLERESP, (st), (i)) +#define sk_OCSP_SINGLERESP_set(st, i, val) SKM_sk_set(OCSP_SINGLERESP, (st), (i), (val)) +#define sk_OCSP_SINGLERESP_zero(st) SKM_sk_zero(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_push(st, val) SKM_sk_push(OCSP_SINGLERESP, (st), (val)) +#define sk_OCSP_SINGLERESP_unshift(st, val) SKM_sk_unshift(OCSP_SINGLERESP, (st), (val)) +#define sk_OCSP_SINGLERESP_find(st, val) SKM_sk_find(OCSP_SINGLERESP, (st), (val)) +#define sk_OCSP_SINGLERESP_find_ex(st, val) SKM_sk_find_ex(OCSP_SINGLERESP, (st), (val)) +#define sk_OCSP_SINGLERESP_delete(st, i) SKM_sk_delete(OCSP_SINGLERESP, (st), (i)) +#define sk_OCSP_SINGLERESP_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_SINGLERESP, (st), (ptr)) +#define sk_OCSP_SINGLERESP_insert(st, val, i) SKM_sk_insert(OCSP_SINGLERESP, (st), (val), (i)) +#define sk_OCSP_SINGLERESP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_SINGLERESP, (st), (cmp)) +#define sk_OCSP_SINGLERESP_dup(st) SKM_sk_dup(OCSP_SINGLERESP, st) +#define sk_OCSP_SINGLERESP_pop_free(st, free_func) SKM_sk_pop_free(OCSP_SINGLERESP, (st), (free_func)) +#define sk_OCSP_SINGLERESP_shift(st) SKM_sk_shift(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_pop(st) SKM_sk_pop(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_sort(st) SKM_sk_sort(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_is_sorted(st) SKM_sk_is_sorted(OCSP_SINGLERESP, (st)) + +#define sk_PKCS12_SAFEBAG_new(st) SKM_sk_new(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_new_null() SKM_sk_new_null(PKCS12_SAFEBAG) +#define sk_PKCS12_SAFEBAG_free(st) SKM_sk_free(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_num(st) SKM_sk_num(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_value(st, i) SKM_sk_value(PKCS12_SAFEBAG, (st), (i)) +#define sk_PKCS12_SAFEBAG_set(st, i, val) SKM_sk_set(PKCS12_SAFEBAG, (st), (i), (val)) +#define sk_PKCS12_SAFEBAG_zero(st) SKM_sk_zero(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_push(st, val) SKM_sk_push(PKCS12_SAFEBAG, (st), (val)) +#define sk_PKCS12_SAFEBAG_unshift(st, val) SKM_sk_unshift(PKCS12_SAFEBAG, (st), (val)) +#define sk_PKCS12_SAFEBAG_find(st, val) SKM_sk_find(PKCS12_SAFEBAG, (st), (val)) +#define sk_PKCS12_SAFEBAG_find_ex(st, val) SKM_sk_find_ex(PKCS12_SAFEBAG, (st), (val)) +#define sk_PKCS12_SAFEBAG_delete(st, i) SKM_sk_delete(PKCS12_SAFEBAG, (st), (i)) +#define sk_PKCS12_SAFEBAG_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS12_SAFEBAG, (st), (ptr)) +#define sk_PKCS12_SAFEBAG_insert(st, val, i) SKM_sk_insert(PKCS12_SAFEBAG, (st), (val), (i)) +#define sk_PKCS12_SAFEBAG_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS12_SAFEBAG, (st), (cmp)) +#define sk_PKCS12_SAFEBAG_dup(st) SKM_sk_dup(PKCS12_SAFEBAG, st) +#define sk_PKCS12_SAFEBAG_pop_free(st, free_func) SKM_sk_pop_free(PKCS12_SAFEBAG, (st), (free_func)) +#define sk_PKCS12_SAFEBAG_shift(st) SKM_sk_shift(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_pop(st) SKM_sk_pop(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_sort(st) SKM_sk_sort(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_is_sorted(st) SKM_sk_is_sorted(PKCS12_SAFEBAG, (st)) + +#define sk_PKCS7_new(st) SKM_sk_new(PKCS7, (st)) +#define sk_PKCS7_new_null() SKM_sk_new_null(PKCS7) +#define sk_PKCS7_free(st) SKM_sk_free(PKCS7, (st)) +#define sk_PKCS7_num(st) SKM_sk_num(PKCS7, (st)) +#define sk_PKCS7_value(st, i) SKM_sk_value(PKCS7, (st), (i)) +#define sk_PKCS7_set(st, i, val) SKM_sk_set(PKCS7, (st), (i), (val)) +#define sk_PKCS7_zero(st) SKM_sk_zero(PKCS7, (st)) +#define sk_PKCS7_push(st, val) SKM_sk_push(PKCS7, (st), (val)) +#define sk_PKCS7_unshift(st, val) SKM_sk_unshift(PKCS7, (st), (val)) +#define sk_PKCS7_find(st, val) SKM_sk_find(PKCS7, (st), (val)) +#define sk_PKCS7_find_ex(st, val) SKM_sk_find_ex(PKCS7, (st), (val)) +#define sk_PKCS7_delete(st, i) SKM_sk_delete(PKCS7, (st), (i)) +#define sk_PKCS7_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7, (st), (ptr)) +#define sk_PKCS7_insert(st, val, i) SKM_sk_insert(PKCS7, (st), (val), (i)) +#define sk_PKCS7_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7, (st), (cmp)) +#define sk_PKCS7_dup(st) SKM_sk_dup(PKCS7, st) +#define sk_PKCS7_pop_free(st, free_func) SKM_sk_pop_free(PKCS7, (st), (free_func)) +#define sk_PKCS7_shift(st) SKM_sk_shift(PKCS7, (st)) +#define sk_PKCS7_pop(st) SKM_sk_pop(PKCS7, (st)) +#define sk_PKCS7_sort(st) SKM_sk_sort(PKCS7, (st)) +#define sk_PKCS7_is_sorted(st) SKM_sk_is_sorted(PKCS7, (st)) + +#define sk_PKCS7_RECIP_INFO_new(st) SKM_sk_new(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_new_null() SKM_sk_new_null(PKCS7_RECIP_INFO) +#define sk_PKCS7_RECIP_INFO_free(st) SKM_sk_free(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_num(st) SKM_sk_num(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_value(st, i) SKM_sk_value(PKCS7_RECIP_INFO, (st), (i)) +#define sk_PKCS7_RECIP_INFO_set(st, i, val) SKM_sk_set(PKCS7_RECIP_INFO, (st), (i), (val)) +#define sk_PKCS7_RECIP_INFO_zero(st) SKM_sk_zero(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_push(st, val) SKM_sk_push(PKCS7_RECIP_INFO, (st), (val)) +#define sk_PKCS7_RECIP_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_RECIP_INFO, (st), (val)) +#define sk_PKCS7_RECIP_INFO_find(st, val) SKM_sk_find(PKCS7_RECIP_INFO, (st), (val)) +#define sk_PKCS7_RECIP_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_RECIP_INFO, (st), (val)) +#define sk_PKCS7_RECIP_INFO_delete(st, i) SKM_sk_delete(PKCS7_RECIP_INFO, (st), (i)) +#define sk_PKCS7_RECIP_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_RECIP_INFO, (st), (ptr)) +#define sk_PKCS7_RECIP_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_RECIP_INFO, (st), (val), (i)) +#define sk_PKCS7_RECIP_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_RECIP_INFO, (st), (cmp)) +#define sk_PKCS7_RECIP_INFO_dup(st) SKM_sk_dup(PKCS7_RECIP_INFO, st) +#define sk_PKCS7_RECIP_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_RECIP_INFO, (st), (free_func)) +#define sk_PKCS7_RECIP_INFO_shift(st) SKM_sk_shift(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_pop(st) SKM_sk_pop(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_sort(st) SKM_sk_sort(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_RECIP_INFO, (st)) + +#define sk_PKCS7_SIGNER_INFO_new(st) SKM_sk_new(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_new_null() SKM_sk_new_null(PKCS7_SIGNER_INFO) +#define sk_PKCS7_SIGNER_INFO_free(st) SKM_sk_free(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_num(st) SKM_sk_num(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_value(st, i) SKM_sk_value(PKCS7_SIGNER_INFO, (st), (i)) +#define sk_PKCS7_SIGNER_INFO_set(st, i, val) SKM_sk_set(PKCS7_SIGNER_INFO, (st), (i), (val)) +#define sk_PKCS7_SIGNER_INFO_zero(st) SKM_sk_zero(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_push(st, val) SKM_sk_push(PKCS7_SIGNER_INFO, (st), (val)) +#define sk_PKCS7_SIGNER_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_SIGNER_INFO, (st), (val)) +#define sk_PKCS7_SIGNER_INFO_find(st, val) SKM_sk_find(PKCS7_SIGNER_INFO, (st), (val)) +#define sk_PKCS7_SIGNER_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_SIGNER_INFO, (st), (val)) +#define sk_PKCS7_SIGNER_INFO_delete(st, i) SKM_sk_delete(PKCS7_SIGNER_INFO, (st), (i)) +#define sk_PKCS7_SIGNER_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_SIGNER_INFO, (st), (ptr)) +#define sk_PKCS7_SIGNER_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_SIGNER_INFO, (st), (val), (i)) +#define sk_PKCS7_SIGNER_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_SIGNER_INFO, (st), (cmp)) +#define sk_PKCS7_SIGNER_INFO_dup(st) SKM_sk_dup(PKCS7_SIGNER_INFO, st) +#define sk_PKCS7_SIGNER_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_SIGNER_INFO, (st), (free_func)) +#define sk_PKCS7_SIGNER_INFO_shift(st) SKM_sk_shift(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_pop(st) SKM_sk_pop(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_sort(st) SKM_sk_sort(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_SIGNER_INFO, (st)) + +#define sk_POLICYINFO_new(st) SKM_sk_new(POLICYINFO, (st)) +#define sk_POLICYINFO_new_null() SKM_sk_new_null(POLICYINFO) +#define sk_POLICYINFO_free(st) SKM_sk_free(POLICYINFO, (st)) +#define sk_POLICYINFO_num(st) SKM_sk_num(POLICYINFO, (st)) +#define sk_POLICYINFO_value(st, i) SKM_sk_value(POLICYINFO, (st), (i)) +#define sk_POLICYINFO_set(st, i, val) SKM_sk_set(POLICYINFO, (st), (i), (val)) +#define sk_POLICYINFO_zero(st) SKM_sk_zero(POLICYINFO, (st)) +#define sk_POLICYINFO_push(st, val) SKM_sk_push(POLICYINFO, (st), (val)) +#define sk_POLICYINFO_unshift(st, val) SKM_sk_unshift(POLICYINFO, (st), (val)) +#define sk_POLICYINFO_find(st, val) SKM_sk_find(POLICYINFO, (st), (val)) +#define sk_POLICYINFO_find_ex(st, val) SKM_sk_find_ex(POLICYINFO, (st), (val)) +#define sk_POLICYINFO_delete(st, i) SKM_sk_delete(POLICYINFO, (st), (i)) +#define sk_POLICYINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYINFO, (st), (ptr)) +#define sk_POLICYINFO_insert(st, val, i) SKM_sk_insert(POLICYINFO, (st), (val), (i)) +#define sk_POLICYINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYINFO, (st), (cmp)) +#define sk_POLICYINFO_dup(st) SKM_sk_dup(POLICYINFO, st) +#define sk_POLICYINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYINFO, (st), (free_func)) +#define sk_POLICYINFO_shift(st) SKM_sk_shift(POLICYINFO, (st)) +#define sk_POLICYINFO_pop(st) SKM_sk_pop(POLICYINFO, (st)) +#define sk_POLICYINFO_sort(st) SKM_sk_sort(POLICYINFO, (st)) +#define sk_POLICYINFO_is_sorted(st) SKM_sk_is_sorted(POLICYINFO, (st)) + +#define sk_POLICYQUALINFO_new(st) SKM_sk_new(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_new_null() SKM_sk_new_null(POLICYQUALINFO) +#define sk_POLICYQUALINFO_free(st) SKM_sk_free(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_num(st) SKM_sk_num(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_value(st, i) SKM_sk_value(POLICYQUALINFO, (st), (i)) +#define sk_POLICYQUALINFO_set(st, i, val) SKM_sk_set(POLICYQUALINFO, (st), (i), (val)) +#define sk_POLICYQUALINFO_zero(st) SKM_sk_zero(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_push(st, val) SKM_sk_push(POLICYQUALINFO, (st), (val)) +#define sk_POLICYQUALINFO_unshift(st, val) SKM_sk_unshift(POLICYQUALINFO, (st), (val)) +#define sk_POLICYQUALINFO_find(st, val) SKM_sk_find(POLICYQUALINFO, (st), (val)) +#define sk_POLICYQUALINFO_find_ex(st, val) SKM_sk_find_ex(POLICYQUALINFO, (st), (val)) +#define sk_POLICYQUALINFO_delete(st, i) SKM_sk_delete(POLICYQUALINFO, (st), (i)) +#define sk_POLICYQUALINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYQUALINFO, (st), (ptr)) +#define sk_POLICYQUALINFO_insert(st, val, i) SKM_sk_insert(POLICYQUALINFO, (st), (val), (i)) +#define sk_POLICYQUALINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYQUALINFO, (st), (cmp)) +#define sk_POLICYQUALINFO_dup(st) SKM_sk_dup(POLICYQUALINFO, st) +#define sk_POLICYQUALINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYQUALINFO, (st), (free_func)) +#define sk_POLICYQUALINFO_shift(st) SKM_sk_shift(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_pop(st) SKM_sk_pop(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_sort(st) SKM_sk_sort(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_is_sorted(st) SKM_sk_is_sorted(POLICYQUALINFO, (st)) + +#define sk_POLICY_MAPPING_new(st) SKM_sk_new(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_new_null() SKM_sk_new_null(POLICY_MAPPING) +#define sk_POLICY_MAPPING_free(st) SKM_sk_free(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_num(st) SKM_sk_num(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_value(st, i) SKM_sk_value(POLICY_MAPPING, (st), (i)) +#define sk_POLICY_MAPPING_set(st, i, val) SKM_sk_set(POLICY_MAPPING, (st), (i), (val)) +#define sk_POLICY_MAPPING_zero(st) SKM_sk_zero(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_push(st, val) SKM_sk_push(POLICY_MAPPING, (st), (val)) +#define sk_POLICY_MAPPING_unshift(st, val) SKM_sk_unshift(POLICY_MAPPING, (st), (val)) +#define sk_POLICY_MAPPING_find(st, val) SKM_sk_find(POLICY_MAPPING, (st), (val)) +#define sk_POLICY_MAPPING_find_ex(st, val) SKM_sk_find_ex(POLICY_MAPPING, (st), (val)) +#define sk_POLICY_MAPPING_delete(st, i) SKM_sk_delete(POLICY_MAPPING, (st), (i)) +#define sk_POLICY_MAPPING_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICY_MAPPING, (st), (ptr)) +#define sk_POLICY_MAPPING_insert(st, val, i) SKM_sk_insert(POLICY_MAPPING, (st), (val), (i)) +#define sk_POLICY_MAPPING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICY_MAPPING, (st), (cmp)) +#define sk_POLICY_MAPPING_dup(st) SKM_sk_dup(POLICY_MAPPING, st) +#define sk_POLICY_MAPPING_pop_free(st, free_func) SKM_sk_pop_free(POLICY_MAPPING, (st), (free_func)) +#define sk_POLICY_MAPPING_shift(st) SKM_sk_shift(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_pop(st) SKM_sk_pop(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_sort(st) SKM_sk_sort(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_is_sorted(st) SKM_sk_is_sorted(POLICY_MAPPING, (st)) + +#define sk_SSL_CIPHER_new(st) SKM_sk_new(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_new_null() SKM_sk_new_null(SSL_CIPHER) +#define sk_SSL_CIPHER_free(st) SKM_sk_free(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_num(st) SKM_sk_num(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_value(st, i) SKM_sk_value(SSL_CIPHER, (st), (i)) +#define sk_SSL_CIPHER_set(st, i, val) SKM_sk_set(SSL_CIPHER, (st), (i), (val)) +#define sk_SSL_CIPHER_zero(st) SKM_sk_zero(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_push(st, val) SKM_sk_push(SSL_CIPHER, (st), (val)) +#define sk_SSL_CIPHER_unshift(st, val) SKM_sk_unshift(SSL_CIPHER, (st), (val)) +#define sk_SSL_CIPHER_find(st, val) SKM_sk_find(SSL_CIPHER, (st), (val)) +#define sk_SSL_CIPHER_find_ex(st, val) SKM_sk_find_ex(SSL_CIPHER, (st), (val)) +#define sk_SSL_CIPHER_delete(st, i) SKM_sk_delete(SSL_CIPHER, (st), (i)) +#define sk_SSL_CIPHER_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_CIPHER, (st), (ptr)) +#define sk_SSL_CIPHER_insert(st, val, i) SKM_sk_insert(SSL_CIPHER, (st), (val), (i)) +#define sk_SSL_CIPHER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_CIPHER, (st), (cmp)) +#define sk_SSL_CIPHER_dup(st) SKM_sk_dup(SSL_CIPHER, st) +#define sk_SSL_CIPHER_pop_free(st, free_func) SKM_sk_pop_free(SSL_CIPHER, (st), (free_func)) +#define sk_SSL_CIPHER_shift(st) SKM_sk_shift(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_pop(st) SKM_sk_pop(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_sort(st) SKM_sk_sort(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_is_sorted(st) SKM_sk_is_sorted(SSL_CIPHER, (st)) + +#define sk_SSL_COMP_new(st) SKM_sk_new(SSL_COMP, (st)) +#define sk_SSL_COMP_new_null() SKM_sk_new_null(SSL_COMP) +#define sk_SSL_COMP_free(st) SKM_sk_free(SSL_COMP, (st)) +#define sk_SSL_COMP_num(st) SKM_sk_num(SSL_COMP, (st)) +#define sk_SSL_COMP_value(st, i) SKM_sk_value(SSL_COMP, (st), (i)) +#define sk_SSL_COMP_set(st, i, val) SKM_sk_set(SSL_COMP, (st), (i), (val)) +#define sk_SSL_COMP_zero(st) SKM_sk_zero(SSL_COMP, (st)) +#define sk_SSL_COMP_push(st, val) SKM_sk_push(SSL_COMP, (st), (val)) +#define sk_SSL_COMP_unshift(st, val) SKM_sk_unshift(SSL_COMP, (st), (val)) +#define sk_SSL_COMP_find(st, val) SKM_sk_find(SSL_COMP, (st), (val)) +#define sk_SSL_COMP_find_ex(st, val) SKM_sk_find_ex(SSL_COMP, (st), (val)) +#define sk_SSL_COMP_delete(st, i) SKM_sk_delete(SSL_COMP, (st), (i)) +#define sk_SSL_COMP_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_COMP, (st), (ptr)) +#define sk_SSL_COMP_insert(st, val, i) SKM_sk_insert(SSL_COMP, (st), (val), (i)) +#define sk_SSL_COMP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_COMP, (st), (cmp)) +#define sk_SSL_COMP_dup(st) SKM_sk_dup(SSL_COMP, st) +#define sk_SSL_COMP_pop_free(st, free_func) SKM_sk_pop_free(SSL_COMP, (st), (free_func)) +#define sk_SSL_COMP_shift(st) SKM_sk_shift(SSL_COMP, (st)) +#define sk_SSL_COMP_pop(st) SKM_sk_pop(SSL_COMP, (st)) +#define sk_SSL_COMP_sort(st) SKM_sk_sort(SSL_COMP, (st)) +#define sk_SSL_COMP_is_sorted(st) SKM_sk_is_sorted(SSL_COMP, (st)) + +#define sk_STORE_OBJECT_new(st) SKM_sk_new(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_new_null() SKM_sk_new_null(STORE_OBJECT) +#define sk_STORE_OBJECT_free(st) SKM_sk_free(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_num(st) SKM_sk_num(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_value(st, i) SKM_sk_value(STORE_OBJECT, (st), (i)) +#define sk_STORE_OBJECT_set(st, i, val) SKM_sk_set(STORE_OBJECT, (st), (i), (val)) +#define sk_STORE_OBJECT_zero(st) SKM_sk_zero(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_push(st, val) SKM_sk_push(STORE_OBJECT, (st), (val)) +#define sk_STORE_OBJECT_unshift(st, val) SKM_sk_unshift(STORE_OBJECT, (st), (val)) +#define sk_STORE_OBJECT_find(st, val) SKM_sk_find(STORE_OBJECT, (st), (val)) +#define sk_STORE_OBJECT_find_ex(st, val) SKM_sk_find_ex(STORE_OBJECT, (st), (val)) +#define sk_STORE_OBJECT_delete(st, i) SKM_sk_delete(STORE_OBJECT, (st), (i)) +#define sk_STORE_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_OBJECT, (st), (ptr)) +#define sk_STORE_OBJECT_insert(st, val, i) SKM_sk_insert(STORE_OBJECT, (st), (val), (i)) +#define sk_STORE_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_OBJECT, (st), (cmp)) +#define sk_STORE_OBJECT_dup(st) SKM_sk_dup(STORE_OBJECT, st) +#define sk_STORE_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(STORE_OBJECT, (st), (free_func)) +#define sk_STORE_OBJECT_shift(st) SKM_sk_shift(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_pop(st) SKM_sk_pop(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_sort(st) SKM_sk_sort(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_is_sorted(st) SKM_sk_is_sorted(STORE_OBJECT, (st)) + +#define sk_SXNETID_new(st) SKM_sk_new(SXNETID, (st)) +#define sk_SXNETID_new_null() SKM_sk_new_null(SXNETID) +#define sk_SXNETID_free(st) SKM_sk_free(SXNETID, (st)) +#define sk_SXNETID_num(st) SKM_sk_num(SXNETID, (st)) +#define sk_SXNETID_value(st, i) SKM_sk_value(SXNETID, (st), (i)) +#define sk_SXNETID_set(st, i, val) SKM_sk_set(SXNETID, (st), (i), (val)) +#define sk_SXNETID_zero(st) SKM_sk_zero(SXNETID, (st)) +#define sk_SXNETID_push(st, val) SKM_sk_push(SXNETID, (st), (val)) +#define sk_SXNETID_unshift(st, val) SKM_sk_unshift(SXNETID, (st), (val)) +#define sk_SXNETID_find(st, val) SKM_sk_find(SXNETID, (st), (val)) +#define sk_SXNETID_find_ex(st, val) SKM_sk_find_ex(SXNETID, (st), (val)) +#define sk_SXNETID_delete(st, i) SKM_sk_delete(SXNETID, (st), (i)) +#define sk_SXNETID_delete_ptr(st, ptr) SKM_sk_delete_ptr(SXNETID, (st), (ptr)) +#define sk_SXNETID_insert(st, val, i) SKM_sk_insert(SXNETID, (st), (val), (i)) +#define sk_SXNETID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SXNETID, (st), (cmp)) +#define sk_SXNETID_dup(st) SKM_sk_dup(SXNETID, st) +#define sk_SXNETID_pop_free(st, free_func) SKM_sk_pop_free(SXNETID, (st), (free_func)) +#define sk_SXNETID_shift(st) SKM_sk_shift(SXNETID, (st)) +#define sk_SXNETID_pop(st) SKM_sk_pop(SXNETID, (st)) +#define sk_SXNETID_sort(st) SKM_sk_sort(SXNETID, (st)) +#define sk_SXNETID_is_sorted(st) SKM_sk_is_sorted(SXNETID, (st)) + +#define sk_UI_STRING_new(st) SKM_sk_new(UI_STRING, (st)) +#define sk_UI_STRING_new_null() SKM_sk_new_null(UI_STRING) +#define sk_UI_STRING_free(st) SKM_sk_free(UI_STRING, (st)) +#define sk_UI_STRING_num(st) SKM_sk_num(UI_STRING, (st)) +#define sk_UI_STRING_value(st, i) SKM_sk_value(UI_STRING, (st), (i)) +#define sk_UI_STRING_set(st, i, val) SKM_sk_set(UI_STRING, (st), (i), (val)) +#define sk_UI_STRING_zero(st) SKM_sk_zero(UI_STRING, (st)) +#define sk_UI_STRING_push(st, val) SKM_sk_push(UI_STRING, (st), (val)) +#define sk_UI_STRING_unshift(st, val) SKM_sk_unshift(UI_STRING, (st), (val)) +#define sk_UI_STRING_find(st, val) SKM_sk_find(UI_STRING, (st), (val)) +#define sk_UI_STRING_find_ex(st, val) SKM_sk_find_ex(UI_STRING, (st), (val)) +#define sk_UI_STRING_delete(st, i) SKM_sk_delete(UI_STRING, (st), (i)) +#define sk_UI_STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(UI_STRING, (st), (ptr)) +#define sk_UI_STRING_insert(st, val, i) SKM_sk_insert(UI_STRING, (st), (val), (i)) +#define sk_UI_STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(UI_STRING, (st), (cmp)) +#define sk_UI_STRING_dup(st) SKM_sk_dup(UI_STRING, st) +#define sk_UI_STRING_pop_free(st, free_func) SKM_sk_pop_free(UI_STRING, (st), (free_func)) +#define sk_UI_STRING_shift(st) SKM_sk_shift(UI_STRING, (st)) +#define sk_UI_STRING_pop(st) SKM_sk_pop(UI_STRING, (st)) +#define sk_UI_STRING_sort(st) SKM_sk_sort(UI_STRING, (st)) +#define sk_UI_STRING_is_sorted(st) SKM_sk_is_sorted(UI_STRING, (st)) + +#define sk_X509_new(st) SKM_sk_new(X509, (st)) +#define sk_X509_new_null() SKM_sk_new_null(X509) +#define sk_X509_free(st) SKM_sk_free(X509, (st)) +#define sk_X509_num(st) SKM_sk_num(X509, (st)) +#define sk_X509_value(st, i) SKM_sk_value(X509, (st), (i)) +#define sk_X509_set(st, i, val) SKM_sk_set(X509, (st), (i), (val)) +#define sk_X509_zero(st) SKM_sk_zero(X509, (st)) +#define sk_X509_push(st, val) SKM_sk_push(X509, (st), (val)) +#define sk_X509_unshift(st, val) SKM_sk_unshift(X509, (st), (val)) +#define sk_X509_find(st, val) SKM_sk_find(X509, (st), (val)) +#define sk_X509_find_ex(st, val) SKM_sk_find_ex(X509, (st), (val)) +#define sk_X509_delete(st, i) SKM_sk_delete(X509, (st), (i)) +#define sk_X509_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509, (st), (ptr)) +#define sk_X509_insert(st, val, i) SKM_sk_insert(X509, (st), (val), (i)) +#define sk_X509_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509, (st), (cmp)) +#define sk_X509_dup(st) SKM_sk_dup(X509, st) +#define sk_X509_pop_free(st, free_func) SKM_sk_pop_free(X509, (st), (free_func)) +#define sk_X509_shift(st) SKM_sk_shift(X509, (st)) +#define sk_X509_pop(st) SKM_sk_pop(X509, (st)) +#define sk_X509_sort(st) SKM_sk_sort(X509, (st)) +#define sk_X509_is_sorted(st) SKM_sk_is_sorted(X509, (st)) + +#define sk_X509V3_EXT_METHOD_new(st) SKM_sk_new(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_new_null() SKM_sk_new_null(X509V3_EXT_METHOD) +#define sk_X509V3_EXT_METHOD_free(st) SKM_sk_free(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_num(st) SKM_sk_num(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_value(st, i) SKM_sk_value(X509V3_EXT_METHOD, (st), (i)) +#define sk_X509V3_EXT_METHOD_set(st, i, val) SKM_sk_set(X509V3_EXT_METHOD, (st), (i), (val)) +#define sk_X509V3_EXT_METHOD_zero(st) SKM_sk_zero(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_push(st, val) SKM_sk_push(X509V3_EXT_METHOD, (st), (val)) +#define sk_X509V3_EXT_METHOD_unshift(st, val) SKM_sk_unshift(X509V3_EXT_METHOD, (st), (val)) +#define sk_X509V3_EXT_METHOD_find(st, val) SKM_sk_find(X509V3_EXT_METHOD, (st), (val)) +#define sk_X509V3_EXT_METHOD_find_ex(st, val) SKM_sk_find_ex(X509V3_EXT_METHOD, (st), (val)) +#define sk_X509V3_EXT_METHOD_delete(st, i) SKM_sk_delete(X509V3_EXT_METHOD, (st), (i)) +#define sk_X509V3_EXT_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509V3_EXT_METHOD, (st), (ptr)) +#define sk_X509V3_EXT_METHOD_insert(st, val, i) SKM_sk_insert(X509V3_EXT_METHOD, (st), (val), (i)) +#define sk_X509V3_EXT_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509V3_EXT_METHOD, (st), (cmp)) +#define sk_X509V3_EXT_METHOD_dup(st) SKM_sk_dup(X509V3_EXT_METHOD, st) +#define sk_X509V3_EXT_METHOD_pop_free(st, free_func) SKM_sk_pop_free(X509V3_EXT_METHOD, (st), (free_func)) +#define sk_X509V3_EXT_METHOD_shift(st) SKM_sk_shift(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_pop(st) SKM_sk_pop(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_sort(st) SKM_sk_sort(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_is_sorted(st) SKM_sk_is_sorted(X509V3_EXT_METHOD, (st)) + +#define sk_X509_ALGOR_new(st) SKM_sk_new(X509_ALGOR, (st)) +#define sk_X509_ALGOR_new_null() SKM_sk_new_null(X509_ALGOR) +#define sk_X509_ALGOR_free(st) SKM_sk_free(X509_ALGOR, (st)) +#define sk_X509_ALGOR_num(st) SKM_sk_num(X509_ALGOR, (st)) +#define sk_X509_ALGOR_value(st, i) SKM_sk_value(X509_ALGOR, (st), (i)) +#define sk_X509_ALGOR_set(st, i, val) SKM_sk_set(X509_ALGOR, (st), (i), (val)) +#define sk_X509_ALGOR_zero(st) SKM_sk_zero(X509_ALGOR, (st)) +#define sk_X509_ALGOR_push(st, val) SKM_sk_push(X509_ALGOR, (st), (val)) +#define sk_X509_ALGOR_unshift(st, val) SKM_sk_unshift(X509_ALGOR, (st), (val)) +#define sk_X509_ALGOR_find(st, val) SKM_sk_find(X509_ALGOR, (st), (val)) +#define sk_X509_ALGOR_find_ex(st, val) SKM_sk_find_ex(X509_ALGOR, (st), (val)) +#define sk_X509_ALGOR_delete(st, i) SKM_sk_delete(X509_ALGOR, (st), (i)) +#define sk_X509_ALGOR_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ALGOR, (st), (ptr)) +#define sk_X509_ALGOR_insert(st, val, i) SKM_sk_insert(X509_ALGOR, (st), (val), (i)) +#define sk_X509_ALGOR_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ALGOR, (st), (cmp)) +#define sk_X509_ALGOR_dup(st) SKM_sk_dup(X509_ALGOR, st) +#define sk_X509_ALGOR_pop_free(st, free_func) SKM_sk_pop_free(X509_ALGOR, (st), (free_func)) +#define sk_X509_ALGOR_shift(st) SKM_sk_shift(X509_ALGOR, (st)) +#define sk_X509_ALGOR_pop(st) SKM_sk_pop(X509_ALGOR, (st)) +#define sk_X509_ALGOR_sort(st) SKM_sk_sort(X509_ALGOR, (st)) +#define sk_X509_ALGOR_is_sorted(st) SKM_sk_is_sorted(X509_ALGOR, (st)) + +#define sk_X509_ATTRIBUTE_new(st) SKM_sk_new(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_new_null() SKM_sk_new_null(X509_ATTRIBUTE) +#define sk_X509_ATTRIBUTE_free(st) SKM_sk_free(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_num(st) SKM_sk_num(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_value(st, i) SKM_sk_value(X509_ATTRIBUTE, (st), (i)) +#define sk_X509_ATTRIBUTE_set(st, i, val) SKM_sk_set(X509_ATTRIBUTE, (st), (i), (val)) +#define sk_X509_ATTRIBUTE_zero(st) SKM_sk_zero(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_push(st, val) SKM_sk_push(X509_ATTRIBUTE, (st), (val)) +#define sk_X509_ATTRIBUTE_unshift(st, val) SKM_sk_unshift(X509_ATTRIBUTE, (st), (val)) +#define sk_X509_ATTRIBUTE_find(st, val) SKM_sk_find(X509_ATTRIBUTE, (st), (val)) +#define sk_X509_ATTRIBUTE_find_ex(st, val) SKM_sk_find_ex(X509_ATTRIBUTE, (st), (val)) +#define sk_X509_ATTRIBUTE_delete(st, i) SKM_sk_delete(X509_ATTRIBUTE, (st), (i)) +#define sk_X509_ATTRIBUTE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ATTRIBUTE, (st), (ptr)) +#define sk_X509_ATTRIBUTE_insert(st, val, i) SKM_sk_insert(X509_ATTRIBUTE, (st), (val), (i)) +#define sk_X509_ATTRIBUTE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ATTRIBUTE, (st), (cmp)) +#define sk_X509_ATTRIBUTE_dup(st) SKM_sk_dup(X509_ATTRIBUTE, st) +#define sk_X509_ATTRIBUTE_pop_free(st, free_func) SKM_sk_pop_free(X509_ATTRIBUTE, (st), (free_func)) +#define sk_X509_ATTRIBUTE_shift(st) SKM_sk_shift(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_pop(st) SKM_sk_pop(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_sort(st) SKM_sk_sort(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_is_sorted(st) SKM_sk_is_sorted(X509_ATTRIBUTE, (st)) + +#define sk_X509_CRL_new(st) SKM_sk_new(X509_CRL, (st)) +#define sk_X509_CRL_new_null() SKM_sk_new_null(X509_CRL) +#define sk_X509_CRL_free(st) SKM_sk_free(X509_CRL, (st)) +#define sk_X509_CRL_num(st) SKM_sk_num(X509_CRL, (st)) +#define sk_X509_CRL_value(st, i) SKM_sk_value(X509_CRL, (st), (i)) +#define sk_X509_CRL_set(st, i, val) SKM_sk_set(X509_CRL, (st), (i), (val)) +#define sk_X509_CRL_zero(st) SKM_sk_zero(X509_CRL, (st)) +#define sk_X509_CRL_push(st, val) SKM_sk_push(X509_CRL, (st), (val)) +#define sk_X509_CRL_unshift(st, val) SKM_sk_unshift(X509_CRL, (st), (val)) +#define sk_X509_CRL_find(st, val) SKM_sk_find(X509_CRL, (st), (val)) +#define sk_X509_CRL_find_ex(st, val) SKM_sk_find_ex(X509_CRL, (st), (val)) +#define sk_X509_CRL_delete(st, i) SKM_sk_delete(X509_CRL, (st), (i)) +#define sk_X509_CRL_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_CRL, (st), (ptr)) +#define sk_X509_CRL_insert(st, val, i) SKM_sk_insert(X509_CRL, (st), (val), (i)) +#define sk_X509_CRL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_CRL, (st), (cmp)) +#define sk_X509_CRL_dup(st) SKM_sk_dup(X509_CRL, st) +#define sk_X509_CRL_pop_free(st, free_func) SKM_sk_pop_free(X509_CRL, (st), (free_func)) +#define sk_X509_CRL_shift(st) SKM_sk_shift(X509_CRL, (st)) +#define sk_X509_CRL_pop(st) SKM_sk_pop(X509_CRL, (st)) +#define sk_X509_CRL_sort(st) SKM_sk_sort(X509_CRL, (st)) +#define sk_X509_CRL_is_sorted(st) SKM_sk_is_sorted(X509_CRL, (st)) + +#define sk_X509_EXTENSION_new(st) SKM_sk_new(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_new_null() SKM_sk_new_null(X509_EXTENSION) +#define sk_X509_EXTENSION_free(st) SKM_sk_free(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_num(st) SKM_sk_num(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_value(st, i) SKM_sk_value(X509_EXTENSION, (st), (i)) +#define sk_X509_EXTENSION_set(st, i, val) SKM_sk_set(X509_EXTENSION, (st), (i), (val)) +#define sk_X509_EXTENSION_zero(st) SKM_sk_zero(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_push(st, val) SKM_sk_push(X509_EXTENSION, (st), (val)) +#define sk_X509_EXTENSION_unshift(st, val) SKM_sk_unshift(X509_EXTENSION, (st), (val)) +#define sk_X509_EXTENSION_find(st, val) SKM_sk_find(X509_EXTENSION, (st), (val)) +#define sk_X509_EXTENSION_find_ex(st, val) SKM_sk_find_ex(X509_EXTENSION, (st), (val)) +#define sk_X509_EXTENSION_delete(st, i) SKM_sk_delete(X509_EXTENSION, (st), (i)) +#define sk_X509_EXTENSION_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_EXTENSION, (st), (ptr)) +#define sk_X509_EXTENSION_insert(st, val, i) SKM_sk_insert(X509_EXTENSION, (st), (val), (i)) +#define sk_X509_EXTENSION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_EXTENSION, (st), (cmp)) +#define sk_X509_EXTENSION_dup(st) SKM_sk_dup(X509_EXTENSION, st) +#define sk_X509_EXTENSION_pop_free(st, free_func) SKM_sk_pop_free(X509_EXTENSION, (st), (free_func)) +#define sk_X509_EXTENSION_shift(st) SKM_sk_shift(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_pop(st) SKM_sk_pop(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_sort(st) SKM_sk_sort(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_is_sorted(st) SKM_sk_is_sorted(X509_EXTENSION, (st)) + +#define sk_X509_INFO_new(st) SKM_sk_new(X509_INFO, (st)) +#define sk_X509_INFO_new_null() SKM_sk_new_null(X509_INFO) +#define sk_X509_INFO_free(st) SKM_sk_free(X509_INFO, (st)) +#define sk_X509_INFO_num(st) SKM_sk_num(X509_INFO, (st)) +#define sk_X509_INFO_value(st, i) SKM_sk_value(X509_INFO, (st), (i)) +#define sk_X509_INFO_set(st, i, val) SKM_sk_set(X509_INFO, (st), (i), (val)) +#define sk_X509_INFO_zero(st) SKM_sk_zero(X509_INFO, (st)) +#define sk_X509_INFO_push(st, val) SKM_sk_push(X509_INFO, (st), (val)) +#define sk_X509_INFO_unshift(st, val) SKM_sk_unshift(X509_INFO, (st), (val)) +#define sk_X509_INFO_find(st, val) SKM_sk_find(X509_INFO, (st), (val)) +#define sk_X509_INFO_find_ex(st, val) SKM_sk_find_ex(X509_INFO, (st), (val)) +#define sk_X509_INFO_delete(st, i) SKM_sk_delete(X509_INFO, (st), (i)) +#define sk_X509_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_INFO, (st), (ptr)) +#define sk_X509_INFO_insert(st, val, i) SKM_sk_insert(X509_INFO, (st), (val), (i)) +#define sk_X509_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_INFO, (st), (cmp)) +#define sk_X509_INFO_dup(st) SKM_sk_dup(X509_INFO, st) +#define sk_X509_INFO_pop_free(st, free_func) SKM_sk_pop_free(X509_INFO, (st), (free_func)) +#define sk_X509_INFO_shift(st) SKM_sk_shift(X509_INFO, (st)) +#define sk_X509_INFO_pop(st) SKM_sk_pop(X509_INFO, (st)) +#define sk_X509_INFO_sort(st) SKM_sk_sort(X509_INFO, (st)) +#define sk_X509_INFO_is_sorted(st) SKM_sk_is_sorted(X509_INFO, (st)) + +#define sk_X509_LOOKUP_new(st) SKM_sk_new(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_new_null() SKM_sk_new_null(X509_LOOKUP) +#define sk_X509_LOOKUP_free(st) SKM_sk_free(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_num(st) SKM_sk_num(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_value(st, i) SKM_sk_value(X509_LOOKUP, (st), (i)) +#define sk_X509_LOOKUP_set(st, i, val) SKM_sk_set(X509_LOOKUP, (st), (i), (val)) +#define sk_X509_LOOKUP_zero(st) SKM_sk_zero(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_push(st, val) SKM_sk_push(X509_LOOKUP, (st), (val)) +#define sk_X509_LOOKUP_unshift(st, val) SKM_sk_unshift(X509_LOOKUP, (st), (val)) +#define sk_X509_LOOKUP_find(st, val) SKM_sk_find(X509_LOOKUP, (st), (val)) +#define sk_X509_LOOKUP_find_ex(st, val) SKM_sk_find_ex(X509_LOOKUP, (st), (val)) +#define sk_X509_LOOKUP_delete(st, i) SKM_sk_delete(X509_LOOKUP, (st), (i)) +#define sk_X509_LOOKUP_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_LOOKUP, (st), (ptr)) +#define sk_X509_LOOKUP_insert(st, val, i) SKM_sk_insert(X509_LOOKUP, (st), (val), (i)) +#define sk_X509_LOOKUP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_LOOKUP, (st), (cmp)) +#define sk_X509_LOOKUP_dup(st) SKM_sk_dup(X509_LOOKUP, st) +#define sk_X509_LOOKUP_pop_free(st, free_func) SKM_sk_pop_free(X509_LOOKUP, (st), (free_func)) +#define sk_X509_LOOKUP_shift(st) SKM_sk_shift(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_pop(st) SKM_sk_pop(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_sort(st) SKM_sk_sort(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_is_sorted(st) SKM_sk_is_sorted(X509_LOOKUP, (st)) + +#define sk_X509_NAME_new(st) SKM_sk_new(X509_NAME, (st)) +#define sk_X509_NAME_new_null() SKM_sk_new_null(X509_NAME) +#define sk_X509_NAME_free(st) SKM_sk_free(X509_NAME, (st)) +#define sk_X509_NAME_num(st) SKM_sk_num(X509_NAME, (st)) +#define sk_X509_NAME_value(st, i) SKM_sk_value(X509_NAME, (st), (i)) +#define sk_X509_NAME_set(st, i, val) SKM_sk_set(X509_NAME, (st), (i), (val)) +#define sk_X509_NAME_zero(st) SKM_sk_zero(X509_NAME, (st)) +#define sk_X509_NAME_push(st, val) SKM_sk_push(X509_NAME, (st), (val)) +#define sk_X509_NAME_unshift(st, val) SKM_sk_unshift(X509_NAME, (st), (val)) +#define sk_X509_NAME_find(st, val) SKM_sk_find(X509_NAME, (st), (val)) +#define sk_X509_NAME_find_ex(st, val) SKM_sk_find_ex(X509_NAME, (st), (val)) +#define sk_X509_NAME_delete(st, i) SKM_sk_delete(X509_NAME, (st), (i)) +#define sk_X509_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME, (st), (ptr)) +#define sk_X509_NAME_insert(st, val, i) SKM_sk_insert(X509_NAME, (st), (val), (i)) +#define sk_X509_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME, (st), (cmp)) +#define sk_X509_NAME_dup(st) SKM_sk_dup(X509_NAME, st) +#define sk_X509_NAME_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME, (st), (free_func)) +#define sk_X509_NAME_shift(st) SKM_sk_shift(X509_NAME, (st)) +#define sk_X509_NAME_pop(st) SKM_sk_pop(X509_NAME, (st)) +#define sk_X509_NAME_sort(st) SKM_sk_sort(X509_NAME, (st)) +#define sk_X509_NAME_is_sorted(st) SKM_sk_is_sorted(X509_NAME, (st)) + +#define sk_X509_NAME_ENTRY_new(st) SKM_sk_new(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_new_null() SKM_sk_new_null(X509_NAME_ENTRY) +#define sk_X509_NAME_ENTRY_free(st) SKM_sk_free(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_num(st) SKM_sk_num(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_value(st, i) SKM_sk_value(X509_NAME_ENTRY, (st), (i)) +#define sk_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(X509_NAME_ENTRY, (st), (i), (val)) +#define sk_X509_NAME_ENTRY_zero(st) SKM_sk_zero(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_push(st, val) SKM_sk_push(X509_NAME_ENTRY, (st), (val)) +#define sk_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(X509_NAME_ENTRY, (st), (val)) +#define sk_X509_NAME_ENTRY_find(st, val) SKM_sk_find(X509_NAME_ENTRY, (st), (val)) +#define sk_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(X509_NAME_ENTRY, (st), (val)) +#define sk_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(X509_NAME_ENTRY, (st), (i)) +#define sk_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME_ENTRY, (st), (ptr)) +#define sk_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(X509_NAME_ENTRY, (st), (val), (i)) +#define sk_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME_ENTRY, (st), (cmp)) +#define sk_X509_NAME_ENTRY_dup(st) SKM_sk_dup(X509_NAME_ENTRY, st) +#define sk_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME_ENTRY, (st), (free_func)) +#define sk_X509_NAME_ENTRY_shift(st) SKM_sk_shift(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_pop(st) SKM_sk_pop(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_sort(st) SKM_sk_sort(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(X509_NAME_ENTRY, (st)) + +#define sk_X509_OBJECT_new(st) SKM_sk_new(X509_OBJECT, (st)) +#define sk_X509_OBJECT_new_null() SKM_sk_new_null(X509_OBJECT) +#define sk_X509_OBJECT_free(st) SKM_sk_free(X509_OBJECT, (st)) +#define sk_X509_OBJECT_num(st) SKM_sk_num(X509_OBJECT, (st)) +#define sk_X509_OBJECT_value(st, i) SKM_sk_value(X509_OBJECT, (st), (i)) +#define sk_X509_OBJECT_set(st, i, val) SKM_sk_set(X509_OBJECT, (st), (i), (val)) +#define sk_X509_OBJECT_zero(st) SKM_sk_zero(X509_OBJECT, (st)) +#define sk_X509_OBJECT_push(st, val) SKM_sk_push(X509_OBJECT, (st), (val)) +#define sk_X509_OBJECT_unshift(st, val) SKM_sk_unshift(X509_OBJECT, (st), (val)) +#define sk_X509_OBJECT_find(st, val) SKM_sk_find(X509_OBJECT, (st), (val)) +#define sk_X509_OBJECT_find_ex(st, val) SKM_sk_find_ex(X509_OBJECT, (st), (val)) +#define sk_X509_OBJECT_delete(st, i) SKM_sk_delete(X509_OBJECT, (st), (i)) +#define sk_X509_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_OBJECT, (st), (ptr)) +#define sk_X509_OBJECT_insert(st, val, i) SKM_sk_insert(X509_OBJECT, (st), (val), (i)) +#define sk_X509_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_OBJECT, (st), (cmp)) +#define sk_X509_OBJECT_dup(st) SKM_sk_dup(X509_OBJECT, st) +#define sk_X509_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(X509_OBJECT, (st), (free_func)) +#define sk_X509_OBJECT_shift(st) SKM_sk_shift(X509_OBJECT, (st)) +#define sk_X509_OBJECT_pop(st) SKM_sk_pop(X509_OBJECT, (st)) +#define sk_X509_OBJECT_sort(st) SKM_sk_sort(X509_OBJECT, (st)) +#define sk_X509_OBJECT_is_sorted(st) SKM_sk_is_sorted(X509_OBJECT, (st)) + +#define sk_X509_POLICY_DATA_new(st) SKM_sk_new(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_new_null() SKM_sk_new_null(X509_POLICY_DATA) +#define sk_X509_POLICY_DATA_free(st) SKM_sk_free(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_num(st) SKM_sk_num(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_value(st, i) SKM_sk_value(X509_POLICY_DATA, (st), (i)) +#define sk_X509_POLICY_DATA_set(st, i, val) SKM_sk_set(X509_POLICY_DATA, (st), (i), (val)) +#define sk_X509_POLICY_DATA_zero(st) SKM_sk_zero(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_push(st, val) SKM_sk_push(X509_POLICY_DATA, (st), (val)) +#define sk_X509_POLICY_DATA_unshift(st, val) SKM_sk_unshift(X509_POLICY_DATA, (st), (val)) +#define sk_X509_POLICY_DATA_find(st, val) SKM_sk_find(X509_POLICY_DATA, (st), (val)) +#define sk_X509_POLICY_DATA_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_DATA, (st), (val)) +#define sk_X509_POLICY_DATA_delete(st, i) SKM_sk_delete(X509_POLICY_DATA, (st), (i)) +#define sk_X509_POLICY_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_DATA, (st), (ptr)) +#define sk_X509_POLICY_DATA_insert(st, val, i) SKM_sk_insert(X509_POLICY_DATA, (st), (val), (i)) +#define sk_X509_POLICY_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_DATA, (st), (cmp)) +#define sk_X509_POLICY_DATA_dup(st) SKM_sk_dup(X509_POLICY_DATA, st) +#define sk_X509_POLICY_DATA_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_DATA, (st), (free_func)) +#define sk_X509_POLICY_DATA_shift(st) SKM_sk_shift(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_pop(st) SKM_sk_pop(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_sort(st) SKM_sk_sort(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_DATA, (st)) + +#define sk_X509_POLICY_NODE_new(st) SKM_sk_new(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_new_null() SKM_sk_new_null(X509_POLICY_NODE) +#define sk_X509_POLICY_NODE_free(st) SKM_sk_free(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_num(st) SKM_sk_num(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_value(st, i) SKM_sk_value(X509_POLICY_NODE, (st), (i)) +#define sk_X509_POLICY_NODE_set(st, i, val) SKM_sk_set(X509_POLICY_NODE, (st), (i), (val)) +#define sk_X509_POLICY_NODE_zero(st) SKM_sk_zero(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_push(st, val) SKM_sk_push(X509_POLICY_NODE, (st), (val)) +#define sk_X509_POLICY_NODE_unshift(st, val) SKM_sk_unshift(X509_POLICY_NODE, (st), (val)) +#define sk_X509_POLICY_NODE_find(st, val) SKM_sk_find(X509_POLICY_NODE, (st), (val)) +#define sk_X509_POLICY_NODE_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_NODE, (st), (val)) +#define sk_X509_POLICY_NODE_delete(st, i) SKM_sk_delete(X509_POLICY_NODE, (st), (i)) +#define sk_X509_POLICY_NODE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_NODE, (st), (ptr)) +#define sk_X509_POLICY_NODE_insert(st, val, i) SKM_sk_insert(X509_POLICY_NODE, (st), (val), (i)) +#define sk_X509_POLICY_NODE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_NODE, (st), (cmp)) +#define sk_X509_POLICY_NODE_dup(st) SKM_sk_dup(X509_POLICY_NODE, st) +#define sk_X509_POLICY_NODE_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_NODE, (st), (free_func)) +#define sk_X509_POLICY_NODE_shift(st) SKM_sk_shift(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_pop(st) SKM_sk_pop(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_sort(st) SKM_sk_sort(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_NODE, (st)) + +#define sk_X509_POLICY_REF_new(st) SKM_sk_new(X509_POLICY_REF, (st)) +#define sk_X509_POLICY_REF_new_null() SKM_sk_new_null(X509_POLICY_REF) +#define sk_X509_POLICY_REF_free(st) SKM_sk_free(X509_POLICY_REF, (st)) +#define sk_X509_POLICY_REF_num(st) SKM_sk_num(X509_POLICY_REF, (st)) +#define sk_X509_POLICY_REF_value(st, i) SKM_sk_value(X509_POLICY_REF, (st), (i)) +#define sk_X509_POLICY_REF_set(st, i, val) SKM_sk_set(X509_POLICY_REF, (st), (i), (val)) +#define sk_X509_POLICY_REF_zero(st) SKM_sk_zero(X509_POLICY_REF, (st)) +#define sk_X509_POLICY_REF_push(st, val) SKM_sk_push(X509_POLICY_REF, (st), (val)) +#define sk_X509_POLICY_REF_unshift(st, val) SKM_sk_unshift(X509_POLICY_REF, (st), (val)) +#define sk_X509_POLICY_REF_find(st, val) SKM_sk_find(X509_POLICY_REF, (st), (val)) +#define sk_X509_POLICY_REF_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_REF, (st), (val)) +#define sk_X509_POLICY_REF_delete(st, i) SKM_sk_delete(X509_POLICY_REF, (st), (i)) +#define sk_X509_POLICY_REF_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_REF, (st), (ptr)) +#define sk_X509_POLICY_REF_insert(st, val, i) SKM_sk_insert(X509_POLICY_REF, (st), (val), (i)) +#define sk_X509_POLICY_REF_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_REF, (st), (cmp)) +#define sk_X509_POLICY_REF_dup(st) SKM_sk_dup(X509_POLICY_REF, st) +#define sk_X509_POLICY_REF_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_REF, (st), (free_func)) +#define sk_X509_POLICY_REF_shift(st) SKM_sk_shift(X509_POLICY_REF, (st)) +#define sk_X509_POLICY_REF_pop(st) SKM_sk_pop(X509_POLICY_REF, (st)) +#define sk_X509_POLICY_REF_sort(st) SKM_sk_sort(X509_POLICY_REF, (st)) +#define sk_X509_POLICY_REF_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_REF, (st)) + +#define sk_X509_PURPOSE_new(st) SKM_sk_new(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_new_null() SKM_sk_new_null(X509_PURPOSE) +#define sk_X509_PURPOSE_free(st) SKM_sk_free(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_num(st) SKM_sk_num(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_value(st, i) SKM_sk_value(X509_PURPOSE, (st), (i)) +#define sk_X509_PURPOSE_set(st, i, val) SKM_sk_set(X509_PURPOSE, (st), (i), (val)) +#define sk_X509_PURPOSE_zero(st) SKM_sk_zero(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_push(st, val) SKM_sk_push(X509_PURPOSE, (st), (val)) +#define sk_X509_PURPOSE_unshift(st, val) SKM_sk_unshift(X509_PURPOSE, (st), (val)) +#define sk_X509_PURPOSE_find(st, val) SKM_sk_find(X509_PURPOSE, (st), (val)) +#define sk_X509_PURPOSE_find_ex(st, val) SKM_sk_find_ex(X509_PURPOSE, (st), (val)) +#define sk_X509_PURPOSE_delete(st, i) SKM_sk_delete(X509_PURPOSE, (st), (i)) +#define sk_X509_PURPOSE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_PURPOSE, (st), (ptr)) +#define sk_X509_PURPOSE_insert(st, val, i) SKM_sk_insert(X509_PURPOSE, (st), (val), (i)) +#define sk_X509_PURPOSE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_PURPOSE, (st), (cmp)) +#define sk_X509_PURPOSE_dup(st) SKM_sk_dup(X509_PURPOSE, st) +#define sk_X509_PURPOSE_pop_free(st, free_func) SKM_sk_pop_free(X509_PURPOSE, (st), (free_func)) +#define sk_X509_PURPOSE_shift(st) SKM_sk_shift(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_pop(st) SKM_sk_pop(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_sort(st) SKM_sk_sort(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_is_sorted(st) SKM_sk_is_sorted(X509_PURPOSE, (st)) + +#define sk_X509_REVOKED_new(st) SKM_sk_new(X509_REVOKED, (st)) +#define sk_X509_REVOKED_new_null() SKM_sk_new_null(X509_REVOKED) +#define sk_X509_REVOKED_free(st) SKM_sk_free(X509_REVOKED, (st)) +#define sk_X509_REVOKED_num(st) SKM_sk_num(X509_REVOKED, (st)) +#define sk_X509_REVOKED_value(st, i) SKM_sk_value(X509_REVOKED, (st), (i)) +#define sk_X509_REVOKED_set(st, i, val) SKM_sk_set(X509_REVOKED, (st), (i), (val)) +#define sk_X509_REVOKED_zero(st) SKM_sk_zero(X509_REVOKED, (st)) +#define sk_X509_REVOKED_push(st, val) SKM_sk_push(X509_REVOKED, (st), (val)) +#define sk_X509_REVOKED_unshift(st, val) SKM_sk_unshift(X509_REVOKED, (st), (val)) +#define sk_X509_REVOKED_find(st, val) SKM_sk_find(X509_REVOKED, (st), (val)) +#define sk_X509_REVOKED_find_ex(st, val) SKM_sk_find_ex(X509_REVOKED, (st), (val)) +#define sk_X509_REVOKED_delete(st, i) SKM_sk_delete(X509_REVOKED, (st), (i)) +#define sk_X509_REVOKED_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_REVOKED, (st), (ptr)) +#define sk_X509_REVOKED_insert(st, val, i) SKM_sk_insert(X509_REVOKED, (st), (val), (i)) +#define sk_X509_REVOKED_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_REVOKED, (st), (cmp)) +#define sk_X509_REVOKED_dup(st) SKM_sk_dup(X509_REVOKED, st) +#define sk_X509_REVOKED_pop_free(st, free_func) SKM_sk_pop_free(X509_REVOKED, (st), (free_func)) +#define sk_X509_REVOKED_shift(st) SKM_sk_shift(X509_REVOKED, (st)) +#define sk_X509_REVOKED_pop(st) SKM_sk_pop(X509_REVOKED, (st)) +#define sk_X509_REVOKED_sort(st) SKM_sk_sort(X509_REVOKED, (st)) +#define sk_X509_REVOKED_is_sorted(st) SKM_sk_is_sorted(X509_REVOKED, (st)) + +#define sk_X509_TRUST_new(st) SKM_sk_new(X509_TRUST, (st)) +#define sk_X509_TRUST_new_null() SKM_sk_new_null(X509_TRUST) +#define sk_X509_TRUST_free(st) SKM_sk_free(X509_TRUST, (st)) +#define sk_X509_TRUST_num(st) SKM_sk_num(X509_TRUST, (st)) +#define sk_X509_TRUST_value(st, i) SKM_sk_value(X509_TRUST, (st), (i)) +#define sk_X509_TRUST_set(st, i, val) SKM_sk_set(X509_TRUST, (st), (i), (val)) +#define sk_X509_TRUST_zero(st) SKM_sk_zero(X509_TRUST, (st)) +#define sk_X509_TRUST_push(st, val) SKM_sk_push(X509_TRUST, (st), (val)) +#define sk_X509_TRUST_unshift(st, val) SKM_sk_unshift(X509_TRUST, (st), (val)) +#define sk_X509_TRUST_find(st, val) SKM_sk_find(X509_TRUST, (st), (val)) +#define sk_X509_TRUST_find_ex(st, val) SKM_sk_find_ex(X509_TRUST, (st), (val)) +#define sk_X509_TRUST_delete(st, i) SKM_sk_delete(X509_TRUST, (st), (i)) +#define sk_X509_TRUST_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_TRUST, (st), (ptr)) +#define sk_X509_TRUST_insert(st, val, i) SKM_sk_insert(X509_TRUST, (st), (val), (i)) +#define sk_X509_TRUST_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_TRUST, (st), (cmp)) +#define sk_X509_TRUST_dup(st) SKM_sk_dup(X509_TRUST, st) +#define sk_X509_TRUST_pop_free(st, free_func) SKM_sk_pop_free(X509_TRUST, (st), (free_func)) +#define sk_X509_TRUST_shift(st) SKM_sk_shift(X509_TRUST, (st)) +#define sk_X509_TRUST_pop(st) SKM_sk_pop(X509_TRUST, (st)) +#define sk_X509_TRUST_sort(st) SKM_sk_sort(X509_TRUST, (st)) +#define sk_X509_TRUST_is_sorted(st) SKM_sk_is_sorted(X509_TRUST, (st)) + +#define sk_X509_VERIFY_PARAM_new(st) SKM_sk_new(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_new_null() SKM_sk_new_null(X509_VERIFY_PARAM) +#define sk_X509_VERIFY_PARAM_free(st) SKM_sk_free(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_num(st) SKM_sk_num(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_value(st, i) SKM_sk_value(X509_VERIFY_PARAM, (st), (i)) +#define sk_X509_VERIFY_PARAM_set(st, i, val) SKM_sk_set(X509_VERIFY_PARAM, (st), (i), (val)) +#define sk_X509_VERIFY_PARAM_zero(st) SKM_sk_zero(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_push(st, val) SKM_sk_push(X509_VERIFY_PARAM, (st), (val)) +#define sk_X509_VERIFY_PARAM_unshift(st, val) SKM_sk_unshift(X509_VERIFY_PARAM, (st), (val)) +#define sk_X509_VERIFY_PARAM_find(st, val) SKM_sk_find(X509_VERIFY_PARAM, (st), (val)) +#define sk_X509_VERIFY_PARAM_find_ex(st, val) SKM_sk_find_ex(X509_VERIFY_PARAM, (st), (val)) +#define sk_X509_VERIFY_PARAM_delete(st, i) SKM_sk_delete(X509_VERIFY_PARAM, (st), (i)) +#define sk_X509_VERIFY_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_VERIFY_PARAM, (st), (ptr)) +#define sk_X509_VERIFY_PARAM_insert(st, val, i) SKM_sk_insert(X509_VERIFY_PARAM, (st), (val), (i)) +#define sk_X509_VERIFY_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_VERIFY_PARAM, (st), (cmp)) +#define sk_X509_VERIFY_PARAM_dup(st) SKM_sk_dup(X509_VERIFY_PARAM, st) +#define sk_X509_VERIFY_PARAM_pop_free(st, free_func) SKM_sk_pop_free(X509_VERIFY_PARAM, (st), (free_func)) +#define sk_X509_VERIFY_PARAM_shift(st) SKM_sk_shift(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_pop(st) SKM_sk_pop(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_sort(st) SKM_sk_sort(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_is_sorted(st) SKM_sk_is_sorted(X509_VERIFY_PARAM, (st)) + +#define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ACCESS_DESCRIPTION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ACCESS_DESCRIPTION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_ACCESS_DESCRIPTION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ACCESS_DESCRIPTION, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_ACCESS_DESCRIPTION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ACCESS_DESCRIPTION, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_ASN1_INTEGER(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_INTEGER, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_ASN1_INTEGER(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_INTEGER, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_ASN1_INTEGER(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_INTEGER, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_ASN1_INTEGER(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_INTEGER, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_ASN1_OBJECT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_OBJECT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_ASN1_OBJECT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_OBJECT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_ASN1_OBJECT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_OBJECT, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_ASN1_OBJECT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_OBJECT, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_ASN1_TYPE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_TYPE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_ASN1_TYPE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_TYPE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_ASN1_TYPE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_TYPE, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_ASN1_TYPE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_TYPE, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_DIST_POINT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(DIST_POINT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_DIST_POINT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(DIST_POINT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_DIST_POINT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(DIST_POINT, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_DIST_POINT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(DIST_POINT, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_GENERAL_NAME(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(GENERAL_NAME, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_GENERAL_NAME(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(GENERAL_NAME, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_GENERAL_NAME(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(GENERAL_NAME, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_GENERAL_NAME(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(GENERAL_NAME, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_OCSP_ONEREQ(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_ONEREQ, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_OCSP_ONEREQ(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_ONEREQ, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_OCSP_ONEREQ(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_ONEREQ, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_OCSP_ONEREQ(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_ONEREQ, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_SINGLERESP, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_SINGLERESP, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_OCSP_SINGLERESP(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_SINGLERESP, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_OCSP_SINGLERESP(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_SINGLERESP, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS12_SAFEBAG, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS12_SAFEBAG, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_PKCS12_SAFEBAG(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS12_SAFEBAG, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_PKCS12_SAFEBAG(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS12_SAFEBAG, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_PKCS7(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_PKCS7(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_PKCS7(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_PKCS7(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_RECIP_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_RECIP_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_PKCS7_RECIP_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_RECIP_INFO, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_PKCS7_RECIP_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_RECIP_INFO, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_SIGNER_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_SIGNER_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_PKCS7_SIGNER_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_SIGNER_INFO, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_PKCS7_SIGNER_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_SIGNER_INFO, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_POLICYINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_POLICYINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_POLICYINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYINFO, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_POLICYINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYINFO, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_POLICYQUALINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYQUALINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_POLICYQUALINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYQUALINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_POLICYQUALINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYQUALINFO, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_POLICYQUALINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYQUALINFO, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_SXNETID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(SXNETID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_SXNETID(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(SXNETID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_SXNETID(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(SXNETID, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_SXNETID(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(SXNETID, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_ALGOR(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ALGOR, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_ALGOR(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ALGOR, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_ALGOR(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ALGOR, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_ALGOR(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ALGOR, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ATTRIBUTE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ATTRIBUTE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_ATTRIBUTE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ATTRIBUTE, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_ATTRIBUTE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ATTRIBUTE, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_CRL(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_CRL, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_CRL(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_CRL, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_CRL(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_CRL, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_CRL(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_CRL, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_EXTENSION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_EXTENSION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_EXTENSION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_EXTENSION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_EXTENSION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_EXTENSION, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_EXTENSION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_EXTENSION, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_NAME_ENTRY, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_NAME_ENTRY, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_NAME_ENTRY(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_NAME_ENTRY, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_NAME_ENTRY(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_NAME_ENTRY, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_REVOKED(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_REVOKED, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_REVOKED(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_REVOKED, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_REVOKED(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_REVOKED, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_REVOKED(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_REVOKED, (buf), (len), (d2i_func), (free_func)) + +#define PKCS12_decrypt_d2i_PKCS12_SAFEBAG(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS12_SAFEBAG, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) + +#define PKCS12_decrypt_d2i_PKCS7(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS7, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) +/* End of util/mkstack.pl block, you may now edit :-) */ + +#endif /* !defined HEADER_SAFESTACK_H */ diff --git a/mswin32/OpenSSL/include/openssl/sha.h b/mswin32/OpenSSL/include/openssl/sha.h new file mode 100755 index 000000000..eed44d7f9 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/sha.h @@ -0,0 +1,200 @@ +/* crypto/sha/sha.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.] + */ + +#ifndef HEADER_SHA_H +#define HEADER_SHA_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(OPENSSL_NO_SHA) || (defined(OPENSSL_NO_SHA0) && defined(OPENSSL_NO_SHA1)) +#error SHA is disabled. +#endif + +#if defined(OPENSSL_FIPS) +#define FIPS_SHA_SIZE_T size_t +#endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! SHA_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! SHA_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__) +#define SHA_LONG unsigned long +#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) +#define SHA_LONG unsigned long +#define SHA_LONG_LOG2 3 +#else +#define SHA_LONG unsigned int +#endif + +#define SHA_LBLOCK 16 +#define SHA_CBLOCK (SHA_LBLOCK*4) /* SHA treats input data as a + * contiguous array of 32 bit + * wide big-endian values. */ +#define SHA_LAST_BLOCK (SHA_CBLOCK-8) +#define SHA_DIGEST_LENGTH 20 + +typedef struct SHAstate_st + { + SHA_LONG h0,h1,h2,h3,h4; + SHA_LONG Nl,Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num; + } SHA_CTX; + +#ifndef OPENSSL_NO_SHA0 +int SHA_Init(SHA_CTX *c); +int SHA_Update(SHA_CTX *c, const void *data, size_t len); +int SHA_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md); +void SHA_Transform(SHA_CTX *c, const unsigned char *data); +#endif +#ifndef OPENSSL_NO_SHA1 +int SHA1_Init(SHA_CTX *c); +int SHA1_Update(SHA_CTX *c, const void *data, size_t len); +int SHA1_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md); +void SHA1_Transform(SHA_CTX *c, const unsigned char *data); +#endif + +#define SHA256_CBLOCK (SHA_LBLOCK*4) /* SHA-256 treats input data as a + * contiguous array of 32 bit + * wide big-endian values. */ +#define SHA224_DIGEST_LENGTH 28 +#define SHA256_DIGEST_LENGTH 32 + +typedef struct SHA256state_st + { + SHA_LONG h[8]; + SHA_LONG Nl,Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num,md_len; + } SHA256_CTX; + +#ifndef OPENSSL_NO_SHA256 +int SHA224_Init(SHA256_CTX *c); +int SHA224_Update(SHA256_CTX *c, const void *data, size_t len); +int SHA224_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA224(const unsigned char *d, size_t n,unsigned char *md); +int SHA256_Init(SHA256_CTX *c); +int SHA256_Update(SHA256_CTX *c, const void *data, size_t len); +int SHA256_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA256(const unsigned char *d, size_t n,unsigned char *md); +void SHA256_Transform(SHA256_CTX *c, const unsigned char *data); +#endif + +#define SHA384_DIGEST_LENGTH 48 +#define SHA512_DIGEST_LENGTH 64 + +#ifndef OPENSSL_NO_SHA512 +/* + * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64 + * being exactly 64-bit wide. See Implementation Notes in sha512.c + * for further details. + */ +#define SHA512_CBLOCK (SHA_LBLOCK*8) /* SHA-512 treats input data as a + * contiguous array of 64 bit + * wide big-endian values. */ +#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) +#define SHA_LONG64 unsigned __int64 +#define U64(C) C##UI64 +#elif defined(__arch64__) +#define SHA_LONG64 unsigned long +#define U64(C) C##UL +#else +#define SHA_LONG64 unsigned long long +#define U64(C) C##ULL +#endif + +typedef struct SHA512state_st + { + SHA_LONG64 h[8]; + SHA_LONG64 Nl,Nh; + union { + SHA_LONG64 d[SHA_LBLOCK]; + unsigned char p[SHA512_CBLOCK]; + } u; + unsigned int num,md_len; + } SHA512_CTX; +#endif + +#ifndef OPENSSL_NO_SHA512 +int SHA384_Init(SHA512_CTX *c); +int SHA384_Update(SHA512_CTX *c, const void *data, size_t len); +int SHA384_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA384(const unsigned char *d, size_t n,unsigned char *md); +int SHA512_Init(SHA512_CTX *c); +int SHA512_Update(SHA512_CTX *c, const void *data, size_t len); +int SHA512_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA512(const unsigned char *d, size_t n,unsigned char *md); +void SHA512_Transform(SHA512_CTX *c, const unsigned char *data); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/ssl.h b/mswin32/OpenSSL/include/openssl/ssl.h new file mode 100755 index 000000000..ed811195a --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ssl.h @@ -0,0 +1,2026 @@ +/* ssl/ssl.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.] + */ +/* ==================================================================== + * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_SSL_H +#define HEADER_SSL_H + +#include + +#ifndef OPENSSL_NO_COMP +#include +#endif +#ifndef OPENSSL_NO_BIO +#include +#endif +#ifndef OPENSSL_NO_DEPRECATED +#ifndef OPENSSL_NO_X509 +#include +#endif +#include +#include +#include +#endif +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* SSLeay version number for ASN.1 encoding of the session information */ +/* Version 0 - initial version + * Version 1 - added the optional peer certificate + */ +#define SSL_SESSION_ASN1_VERSION 0x0001 + +/* text strings for the ciphers */ +#define SSL_TXT_NULL_WITH_MD5 SSL2_TXT_NULL_WITH_MD5 +#define SSL_TXT_RC4_128_WITH_MD5 SSL2_TXT_RC4_128_WITH_MD5 +#define SSL_TXT_RC4_128_EXPORT40_WITH_MD5 SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 +#define SSL_TXT_RC2_128_CBC_WITH_MD5 SSL2_TXT_RC2_128_CBC_WITH_MD5 +#define SSL_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 +#define SSL_TXT_IDEA_128_CBC_WITH_MD5 SSL2_TXT_IDEA_128_CBC_WITH_MD5 +#define SSL_TXT_DES_64_CBC_WITH_MD5 SSL2_TXT_DES_64_CBC_WITH_MD5 +#define SSL_TXT_DES_64_CBC_WITH_SHA SSL2_TXT_DES_64_CBC_WITH_SHA +#define SSL_TXT_DES_192_EDE3_CBC_WITH_MD5 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 +#define SSL_TXT_DES_192_EDE3_CBC_WITH_SHA SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA + +/* VRS Additional Kerberos5 entries + */ +#define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +#define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +#define SSL_TXT_KRB5_RC4_128_SHA SSL3_TXT_KRB5_RC4_128_SHA +#define SSL_TXT_KRB5_IDEA_128_CBC_SHA SSL3_TXT_KRB5_IDEA_128_CBC_SHA +#define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +#define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +#define SSL_TXT_KRB5_RC4_128_MD5 SSL3_TXT_KRB5_RC4_128_MD5 +#define SSL_TXT_KRB5_IDEA_128_CBC_MD5 SSL3_TXT_KRB5_IDEA_128_CBC_MD5 + +#define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +#define SSL_TXT_KRB5_RC2_40_CBC_SHA SSL3_TXT_KRB5_RC2_40_CBC_SHA +#define SSL_TXT_KRB5_RC4_40_SHA SSL3_TXT_KRB5_RC4_40_SHA +#define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +#define SSL_TXT_KRB5_RC2_40_CBC_MD5 SSL3_TXT_KRB5_RC2_40_CBC_MD5 +#define SSL_TXT_KRB5_RC4_40_MD5 SSL3_TXT_KRB5_RC4_40_MD5 + +#define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +#define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +#define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +#define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +#define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +#define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +#define SSL_MAX_KRB5_PRINCIPAL_LENGTH 256 + +#define SSL_MAX_SSL_SESSION_ID_LENGTH 32 +#define SSL_MAX_SID_CTX_LENGTH 32 + +#define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512/8) +#define SSL_MAX_KEY_ARG_LENGTH 8 +#define SSL_MAX_MASTER_KEY_LENGTH 48 + +/* These are used to specify which ciphers to use and not to use */ +#define SSL_TXT_LOW "LOW" +#define SSL_TXT_MEDIUM "MEDIUM" +#define SSL_TXT_HIGH "HIGH" +#define SSL_TXT_kFZA "kFZA" +#define SSL_TXT_aFZA "aFZA" +#define SSL_TXT_eFZA "eFZA" +#define SSL_TXT_FZA "FZA" + +#define SSL_TXT_aNULL "aNULL" +#define SSL_TXT_eNULL "eNULL" +#define SSL_TXT_NULL "NULL" + +#define SSL_TXT_kKRB5 "kKRB5" +#define SSL_TXT_aKRB5 "aKRB5" +#define SSL_TXT_KRB5 "KRB5" + +#define SSL_TXT_kRSA "kRSA" +#define SSL_TXT_kDHr "kDHr" +#define SSL_TXT_kDHd "kDHd" +#define SSL_TXT_kEDH "kEDH" +#define SSL_TXT_aRSA "aRSA" +#define SSL_TXT_aDSS "aDSS" +#define SSL_TXT_aDH "aDH" +#define SSL_TXT_DSS "DSS" +#define SSL_TXT_DH "DH" +#define SSL_TXT_EDH "EDH" +#define SSL_TXT_ADH "ADH" +#define SSL_TXT_RSA "RSA" +#define SSL_TXT_DES "DES" +#define SSL_TXT_3DES "3DES" +#define SSL_TXT_RC4 "RC4" +#define SSL_TXT_RC2 "RC2" +#define SSL_TXT_IDEA "IDEA" +#define SSL_TXT_SEED "SEED" +#define SSL_TXT_AES "AES" +#define SSL_TXT_CAMELLIA "CAMELLIA" +#define SSL_TXT_MD5 "MD5" +#define SSL_TXT_SHA1 "SHA1" +#define SSL_TXT_SHA "SHA" +#define SSL_TXT_EXP "EXP" +#define SSL_TXT_EXPORT "EXPORT" +#define SSL_TXT_EXP40 "EXPORT40" +#define SSL_TXT_EXP56 "EXPORT56" +#define SSL_TXT_SSLV2 "SSLv2" +#define SSL_TXT_SSLV3 "SSLv3" +#define SSL_TXT_TLSV1 "TLSv1" +#define SSL_TXT_ALL "ALL" +#define SSL_TXT_ECC "ECCdraft" /* ECC ciphersuites are not yet official */ + +/* + * COMPLEMENTOF* definitions. These identifiers are used to (de-select) + * ciphers normally not being used. + * Example: "RC4" will activate all ciphers using RC4 including ciphers + * without authentication, which would normally disabled by DEFAULT (due + * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT" + * will make sure that it is also disabled in the specific selection. + * COMPLEMENTOF* identifiers are portable between version, as adjustments + * to the default cipher setup will also be included here. + * + * COMPLEMENTOFDEFAULT does not experience the same special treatment that + * DEFAULT gets, as only selection is being done and no sorting as needed + * for DEFAULT. + */ +#define SSL_TXT_CMPALL "COMPLEMENTOFALL" +#define SSL_TXT_CMPDEF "COMPLEMENTOFDEFAULT" + +/* The following cipher list is used by default. + * It also is substituted when an application-defined cipher list string + * starts with 'DEFAULT'. */ +#define SSL_DEFAULT_CIPHER_LIST "AES:ALL:!aNULL:!eNULL:+RC4:@STRENGTH" /* low priority for RC4 */ + +/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ +#define SSL_SENT_SHUTDOWN 1 +#define SSL_RECEIVED_SHUTDOWN 2 + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if (defined(OPENSSL_NO_RSA) || defined(OPENSSL_NO_MD5)) && !defined(OPENSSL_NO_SSL2) +#define OPENSSL_NO_SSL2 +#endif + +#define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 +#define SSL_FILETYPE_PEM X509_FILETYPE_PEM + +/* This is needed to stop compilers complaining about the + * 'struct ssl_st *' function parameters used to prototype callbacks + * in SSL_CTX. */ +typedef struct ssl_st *ssl_crock_st; + +/* used to hold info on the particular ciphers used */ +typedef struct ssl_cipher_st + { + int valid; + const char *name; /* text name */ + unsigned long id; /* id, 4 bytes, first is version */ + unsigned long algorithms; /* what ciphers are used */ + unsigned long algo_strength; /* strength and export flags */ + unsigned long algorithm2; /* Extra flags */ + int strength_bits; /* Number of bits really used */ + int alg_bits; /* Number of bits for algorithm */ + unsigned long mask; /* used for matching */ + unsigned long mask_strength; /* also used for matching */ + } SSL_CIPHER; + +DECLARE_STACK_OF(SSL_CIPHER) + +typedef struct ssl_st SSL; +typedef struct ssl_ctx_st SSL_CTX; + +/* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */ +typedef struct ssl_method_st + { + int version; + int (*ssl_new)(SSL *s); + void (*ssl_clear)(SSL *s); + void (*ssl_free)(SSL *s); + int (*ssl_accept)(SSL *s); + int (*ssl_connect)(SSL *s); + int (*ssl_read)(SSL *s,void *buf,int len); + int (*ssl_peek)(SSL *s,void *buf,int len); + int (*ssl_write)(SSL *s,const void *buf,int len); + int (*ssl_shutdown)(SSL *s); + int (*ssl_renegotiate)(SSL *s); + int (*ssl_renegotiate_check)(SSL *s); + long (*ssl_get_message)(SSL *s, int st1, int stn, int mt, long + max, int *ok); + int (*ssl_read_bytes)(SSL *s, int type, unsigned char *buf, int len, + int peek); + int (*ssl_write_bytes)(SSL *s, int type, const void *buf_, int len); + int (*ssl_dispatch_alert)(SSL *s); + long (*ssl_ctrl)(SSL *s,int cmd,long larg,void *parg); + long (*ssl_ctx_ctrl)(SSL_CTX *ctx,int cmd,long larg,void *parg); + SSL_CIPHER *(*get_cipher_by_char)(const unsigned char *ptr); + int (*put_cipher_by_char)(const SSL_CIPHER *cipher,unsigned char *ptr); + int (*ssl_pending)(const SSL *s); + int (*num_ciphers)(void); + SSL_CIPHER *(*get_cipher)(unsigned ncipher); + struct ssl_method_st *(*get_ssl_method)(int version); + long (*get_timeout)(void); + struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */ + int (*ssl_version)(void); + long (*ssl_callback_ctrl)(SSL *s, int cb_id, void (*fp)(void)); + long (*ssl_ctx_callback_ctrl)(SSL_CTX *s, int cb_id, void (*fp)(void)); + } SSL_METHOD; + +/* Lets make this into an ASN.1 type structure as follows + * SSL_SESSION_ID ::= SEQUENCE { + * version INTEGER, -- structure version number + * SSLversion INTEGER, -- SSL version number + * Cipher OCTET_STRING, -- the 3 byte cipher ID + * Session_ID OCTET_STRING, -- the Session ID + * Master_key OCTET_STRING, -- the master key + * KRB5_principal OCTET_STRING -- optional Kerberos principal + * Key_Arg [ 0 ] IMPLICIT OCTET_STRING, -- the optional Key argument + * Time [ 1 ] EXPLICIT INTEGER, -- optional Start Time + * Timeout [ 2 ] EXPLICIT INTEGER, -- optional Timeout ins seconds + * Peer [ 3 ] EXPLICIT X509, -- optional Peer Certificate + * Session_ID_context [ 4 ] EXPLICIT OCTET_STRING, -- the Session ID context + * Verify_result [ 5 ] EXPLICIT INTEGER -- X509_V_... code for `Peer' + * Compression [6] 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 :-). + */ +typedef struct ssl_session_st + { + int ssl_version; /* what ssl version session info is + * being kept in here? */ + + /* only really used in SSLv2 */ + unsigned int key_arg_length; + unsigned char key_arg[SSL_MAX_KEY_ARG_LENGTH]; + int master_key_length; + unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH]; + /* session_id - valid? */ + unsigned int session_id_length; + unsigned char session_id[SSL_MAX_SSL_SESSION_ID_LENGTH]; + /* this is used to determine whether the session is being reused in + * the appropriate context. It is up to the application to set this, + * via SSL_new */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + +#ifndef OPENSSL_NO_KRB5 + unsigned int krb5_client_princ_len; + unsigned char krb5_client_princ[SSL_MAX_KRB5_PRINCIPAL_LENGTH]; +#endif /* OPENSSL_NO_KRB5 */ + + int not_resumable; + + /* The cert is the certificate used to establish this connection */ + struct sess_cert_st /* SESS_CERT */ *sess_cert; + + /* This is the cert for the other end. + * On clients, it will be the same as sess_cert->peer_key->x509 + * (the latter is not enough as sess_cert is not retained + * in the external representation of sessions, see ssl_asn1.c). */ + X509 *peer; + /* when app_verify_callback accepts a session where the peer's certificate + * is not ok, we must remember the error for session reuse: */ + long verify_result; /* only for servers */ + + int references; + long timeout; + long time; + + int compress_meth; /* Need to lookup the method */ + + SSL_CIPHER *cipher; + unsigned long cipher_id; /* when ASN.1 loaded, this + * needs to be used to load + * the 'cipher' structure */ + + STACK_OF(SSL_CIPHER) *ciphers; /* shared ciphers? */ + + CRYPTO_EX_DATA ex_data; /* application specific data */ + + /* These are used to make removal of session-ids more + * efficient and to implement a maximum cache size. */ + struct ssl_session_st *prev,*next; +#ifndef OPENSSL_NO_TLSEXT + char *tlsext_hostname; + /* RFC4507 info */ + unsigned char *tlsext_tick; /* Session ticket */ + size_t tlsext_ticklen; /* Session ticket length */ + long tlsext_tick_lifetime_hint; /* Session lifetime hint in seconds */ +#endif + } SSL_SESSION; + + +#define SSL_OP_MICROSOFT_SESS_ID_BUG 0x00000001L +#define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x00000002L +#define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x00000008L +#define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x00000010L +#define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x00000020L +#define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x00000040L /* no effect since 0.9.7h and 0.9.8b */ +#define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x00000080L +#define SSL_OP_TLS_D5_BUG 0x00000100L +#define SSL_OP_TLS_BLOCK_PADDING_BUG 0x00000200L + +/* Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added + * in OpenSSL 0.9.6d. Usually (depending on the application protocol) + * the workaround is not needed. Unfortunately some broken SSL/TLS + * implementations cannot handle it at all, which is why we include + * it in SSL_OP_ALL. */ +#define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 0x00000800L /* added in 0.9.6e */ + +/* SSL_OP_ALL: various bug workarounds that should be rather harmless. + * This used to be 0x000FFFFFL before 0.9.7. */ +#define SSL_OP_ALL 0x00000FFFL + +/* DTLS options */ +#define SSL_OP_NO_QUERY_MTU 0x00001000L +/* Turn on Cookie Exchange (on relevant for servers) */ +#define SSL_OP_COOKIE_EXCHANGE 0x00002000L +/* Don't use RFC4507 ticket extension */ +#define SSL_OP_NO_TICKET 0x00004000L + +/* As server, disallow session resumption on renegotiation */ +#define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x00010000L +/* If set, always create a new key when using tmp_ecdh parameters */ +#define SSL_OP_SINGLE_ECDH_USE 0x00080000L +/* If set, always create a new key when using tmp_dh parameters */ +#define SSL_OP_SINGLE_DH_USE 0x00100000L +/* Set to always use the tmp_rsa key when doing RSA operations, + * even when this violates protocol specs */ +#define SSL_OP_EPHEMERAL_RSA 0x00200000L +/* Set on servers to choose the cipher according to the server's + * preferences */ +#define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000L +/* If set, a server will allow a client to issue a SSLv3.0 version number + * as latest version supported in the premaster secret, even when TLSv1.0 + * (version 3.1) was announced in the client hello. Normally this is + * forbidden to prevent version rollback attacks. */ +#define SSL_OP_TLS_ROLLBACK_BUG 0x00800000L + +#define SSL_OP_NO_SSLv2 0x01000000L +#define SSL_OP_NO_SSLv3 0x02000000L +#define SSL_OP_NO_TLSv1 0x04000000L + +/* The next flag deliberately 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_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x40000000L + + +/* Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success + * when just a single record has been written): */ +#define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001L +/* Make it possible to retry SSL_write() with changed buffer location + * (buffer contents must stay the same!); this is not the default to avoid + * the misconception that non-blocking SSL_write() behaves like + * non-blocking write(): */ +#define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002L +/* Never bother the application with retries if the transport + * is blocking: */ +#define SSL_MODE_AUTO_RETRY 0x00000004L +/* Don't attempt to automatically build certificate chain */ +#define SSL_MODE_NO_AUTO_CHAIN 0x00000008L + + +/* Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, + * they cannot be used to clear bits. */ + +#define SSL_CTX_set_options(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL) +#define SSL_CTX_get_options(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,0,NULL) +#define SSL_set_options(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,(op),NULL) +#define SSL_get_options(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,0,NULL) + +#define SSL_CTX_set_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL) +#define SSL_CTX_get_mode(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL) +#define SSL_set_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL) +#define SSL_get_mode(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL) +#define SSL_set_mtu(ssl, mtu) \ + SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL) + + +void SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg)); +void SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg)); +#define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) +#define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) + + + +#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32) +#define SSL_MAX_CERT_LIST_DEFAULT 1024*30 /* 30k max cert list :-) */ +#else +#define SSL_MAX_CERT_LIST_DEFAULT 1024*100 /* 100k max cert list :-) */ +#endif + +#define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024*20) + +/* This callback type is used inside SSL_CTX, SSL, and in the functions that set + * them. It is used to override the generation of SSL/TLS session IDs in a + * server. Return value should be zero on an error, non-zero to proceed. Also, + * callbacks should themselves check if the id they generate is unique otherwise + * the SSL handshake will fail with an error - callbacks can do this using the + * 'ssl' value they're passed by; + * SSL_has_matching_session_id(ssl, id, *id_len) + * The length value passed in is set at the maximum size the session ID can be. + * In SSLv2 this is 16 bytes, whereas SSLv3/TLSv1 it is 32 bytes. The callback + * can alter this length to be less if desired, but under SSLv2 session IDs are + * supposed to be fixed at 16 bytes so the id will be padded after the callback + * returns in this case. It is also an error for the callback to set the size to + * zero. */ +typedef int (*GEN_SESSION_CB)(const SSL *ssl, unsigned char *id, + unsigned int *id_len); + +typedef struct ssl_comp_st + { + int id; + const char *name; +#ifndef OPENSSL_NO_COMP + COMP_METHOD *method; +#else + char *method; +#endif + } SSL_COMP; + +DECLARE_STACK_OF(SSL_COMP) + +struct ssl_ctx_st + { + SSL_METHOD *method; + + STACK_OF(SSL_CIPHER) *cipher_list; + /* same as above but sorted for lookup */ + STACK_OF(SSL_CIPHER) *cipher_list_by_id; + + struct x509_store_st /* X509_STORE */ *cert_store; + struct lhash_st /* LHASH */ *sessions; /* a set of SSL_SESSIONs */ + /* Most session-ids that will be cached, default is + * SSL_SESSION_CACHE_MAX_SIZE_DEFAULT. 0 is unlimited. */ + unsigned long session_cache_size; + struct ssl_session_st *session_cache_head; + struct ssl_session_st *session_cache_tail; + + /* This can have one of 2 values, ored together, + * SSL_SESS_CACHE_CLIENT, + * SSL_SESS_CACHE_SERVER, + * Default is SSL_SESSION_CACHE_SERVER, which means only + * SSL_accept which cache SSL_SESSIONS. */ + int session_cache_mode; + + /* If timeout is not 0, it is the default timeout value set + * when SSL_new() is called. This has been put in to make + * life easier to set things up */ + long session_timeout; + + /* If this callback is not null, it will be called each + * time a session id is added to the cache. If this function + * returns 1, it means that the callback will do a + * SSL_SESSION_free() when it has finished using it. Otherwise, + * on 0, it means the callback has finished with it. + * If remove_session_cb is not null, it will be called when + * a session-id is removed from the cache. After the call, + * OpenSSL will SSL_SESSION_free() it. */ + int (*new_session_cb)(struct ssl_st *ssl,SSL_SESSION *sess); + void (*remove_session_cb)(struct ssl_ctx_st *ctx,SSL_SESSION *sess); + SSL_SESSION *(*get_session_cb)(struct ssl_st *ssl, + unsigned char *data,int len,int *copy); + + struct + { + int sess_connect; /* SSL new conn - started */ + int sess_connect_renegotiate;/* SSL reneg - requested */ + int sess_connect_good; /* SSL new conne/reneg - finished */ + int sess_accept; /* SSL new accept - started */ + int sess_accept_renegotiate;/* SSL reneg - requested */ + int sess_accept_good; /* SSL accept/reneg - finished */ + int sess_miss; /* session lookup misses */ + int sess_timeout; /* reuse attempt on timeouted session */ + int sess_cache_full; /* session removed due to full cache */ + int sess_hit; /* session reuse actually done */ + int sess_cb_hit; /* session-id that was not + * in the cache was + * passed back via the callback. This + * indicates that the application is + * supplying session-id's from other + * processes - spooky :-) */ + } stats; + + int references; + + /* if defined, these override the X509_verify_cert() calls */ + int (*app_verify_callback)(X509_STORE_CTX *, void *); + void *app_verify_arg; + /* before OpenSSL 0.9.7, 'app_verify_arg' was ignored + * ('app_verify_callback' was called with just one argument) */ + + /* Default password callback. */ + pem_password_cb *default_passwd_callback; + + /* Default password callback user data. */ + void *default_passwd_callback_userdata; + + /* get client cert callback */ + int (*client_cert_cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey); + + /* cookie generate callback */ + int (*app_gen_cookie_cb)(SSL *ssl, unsigned char *cookie, + unsigned int *cookie_len); + + /* verify cookie callback */ + int (*app_verify_cookie_cb)(SSL *ssl, unsigned char *cookie, + unsigned int cookie_len); + + CRYPTO_EX_DATA ex_data; + + const EVP_MD *rsa_md5;/* For SSLv2 - name is 'ssl2-md5' */ + const EVP_MD *md5; /* For SSLv3/TLSv1 'ssl3-md5' */ + const EVP_MD *sha1; /* For SSLv3/TLSv1 'ssl3->sha1' */ + + STACK_OF(X509) *extra_certs; + STACK_OF(SSL_COMP) *comp_methods; /* stack of SSL_COMP, SSLv3/TLSv1 */ + + + /* Default values used when no per-SSL value is defined follow */ + + void (*info_callback)(const SSL *ssl,int type,int val); /* used if SSL's info_callback is NULL */ + + /* what we put in client cert requests */ + STACK_OF(X509_NAME) *client_CA; + + + /* Default values to use in SSL structures follow (these are copied by SSL_new) */ + + unsigned long options; + unsigned long mode; + long max_cert_list; + + struct cert_st /* CERT */ *cert; + int read_ahead; + + /* callback that allows applications to peek at protocol messages */ + void (*msg_callback)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg); + void *msg_callback_arg; + + int verify_mode; + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + int (*default_verify_callback)(int ok,X509_STORE_CTX *ctx); /* called 'verify_callback' in the SSL */ + + /* Default generate session ID callback. */ + GEN_SESSION_CB generate_session_id; + + X509_VERIFY_PARAM *param; + +#if 0 + int purpose; /* Purpose setting */ + int trust; /* Trust setting */ +#endif + + int quiet_shutdown; + +#ifndef OPENSSL_NO_TLSEXT + /* TLS extensions servername callback */ + int (*tlsext_servername_callback)(SSL*, int *, void *); + void *tlsext_servername_arg; + /* RFC 4507 session ticket keys */ + unsigned char tlsext_tick_key_name[16]; + unsigned char tlsext_tick_hmac_key[16]; + unsigned char tlsext_tick_aes_key[16]; +#endif + + }; + +#define SSL_SESS_CACHE_OFF 0x0000 +#define SSL_SESS_CACHE_CLIENT 0x0001 +#define SSL_SESS_CACHE_SERVER 0x0002 +#define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER) +#define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080 +/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */ +#define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 +#define SSL_SESS_CACHE_NO_INTERNAL_STORE 0x0200 +#define SSL_SESS_CACHE_NO_INTERNAL \ + (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE) + + struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx); +#define SSL_CTX_sess_number(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL) +#define SSL_CTX_sess_connect(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL) +#define SSL_CTX_sess_connect_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL) +#define SSL_CTX_sess_connect_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL) +#define SSL_CTX_sess_accept(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL) +#define SSL_CTX_sess_accept_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL) +#define SSL_CTX_sess_accept_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL) +#define SSL_CTX_sess_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL) +#define SSL_CTX_sess_cb_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL) +#define SSL_CTX_sess_misses(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL) +#define SSL_CTX_sess_timeouts(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL) +#define SSL_CTX_sess_cache_full(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL) + +void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, int (*new_session_cb)(struct ssl_st *ssl,SSL_SESSION *sess)); +int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx))(struct ssl_st *ssl, SSL_SESSION *sess); +void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, void (*remove_session_cb)(struct ssl_ctx_st *ctx,SSL_SESSION *sess)); +void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx))(struct ssl_ctx_st *ctx, SSL_SESSION *sess); +void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, SSL_SESSION *(*get_session_cb)(struct ssl_st *ssl, unsigned char *data,int len,int *copy)); +SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx))(struct ssl_st *ssl, unsigned char *Data, int len, int *copy); +void SSL_CTX_set_info_callback(SSL_CTX *ctx, void (*cb)(const SSL *ssl,int type,int val)); +void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl,int type,int val); +void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, int (*client_cert_cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey)); +int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL *ssl, X509 **x509, EVP_PKEY **pkey); +void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, int (*app_gen_cookie_cb)(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len)); +void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, int (*app_verify_cookie_cb)(SSL *ssl, unsigned char *cookie, unsigned int cookie_len)); + +#define SSL_NOTHING 1 +#define SSL_WRITING 2 +#define SSL_READING 3 +#define SSL_X509_LOOKUP 4 + +/* These will only be used when doing non-blocking IO */ +#define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING) +#define SSL_want_read(s) (SSL_want(s) == SSL_READING) +#define SSL_want_write(s) (SSL_want(s) == SSL_WRITING) +#define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP) + +struct ssl_st + { + /* protocol version + * (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION, DTLS1_VERSION) + */ + int version; + int type; /* SSL_ST_CONNECT or SSL_ST_ACCEPT */ + + SSL_METHOD *method; /* SSLv3 */ + + /* There are 2 BIO's even though they are normally both the + * same. This is so data can be read and written to different + * handlers */ + +#ifndef OPENSSL_NO_BIO + BIO *rbio; /* used by SSL_read */ + BIO *wbio; /* used by SSL_write */ + BIO *bbio; /* used during session-id reuse to concatenate + * messages */ +#else + char *rbio; /* used by SSL_read */ + char *wbio; /* used by SSL_write */ + char *bbio; +#endif + /* This holds a variable that indicates what we were doing + * when a 0 or -1 is returned. This is needed for + * non-blocking IO so we know what request needs re-doing when + * in SSL_accept or SSL_connect */ + int rwstate; + + /* true when we are actually in SSL_accept() or SSL_connect() */ + int in_handshake; + int (*handshake_func)(SSL *); + + /* Imagine that here's a boolean member "init" that is + * switched as soon as SSL_set_{accept/connect}_state + * is called for the first time, so that "state" and + * "handshake_func" are properly initialized. But as + * handshake_func is == 0 until then, we use this + * test instead of an "init" member. + */ + + int server; /* are we the server side? - mostly used by SSL_clear*/ + + int new_session;/* 1 if we are to use a new session. + * 2 if we are a server and are inside a handshake + * (i.e. not just sending a HelloRequest) + * NB: For servers, the 'new' session may actually be a previously + * cached session or even the previous session unless + * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set */ + int quiet_shutdown;/* don't send shutdown packets */ + int shutdown; /* we have shut things down, 0x01 sent, 0x02 + * for received */ + int state; /* where we are */ + int rstate; /* where we are when reading */ + + BUF_MEM *init_buf; /* buffer used during init */ + void *init_msg; /* pointer to handshake message body, set by ssl3_get_message() */ + int init_num; /* amount read/written */ + int init_off; /* amount read/written */ + + /* used internally to point at a raw packet */ + unsigned char *packet; + unsigned int packet_length; + + struct ssl2_state_st *s2; /* SSLv2 variables */ + struct ssl3_state_st *s3; /* SSLv3 variables */ + struct dtls1_state_st *d1; /* DTLSv1 variables */ + + int read_ahead; /* Read as many input bytes as possible + * (for non-blocking reads) */ + + /* callback that allows applications to peek at protocol messages */ + void (*msg_callback)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg); + void *msg_callback_arg; + + int hit; /* reusing a previous session */ + + X509_VERIFY_PARAM *param; + +#if 0 + int purpose; /* Purpose setting */ + int trust; /* Trust setting */ +#endif + + /* crypto */ + STACK_OF(SSL_CIPHER) *cipher_list; + STACK_OF(SSL_CIPHER) *cipher_list_by_id; + + /* These are the ones being used, the ones in SSL_SESSION are + * the ones to be 'copied' into these ones */ + + EVP_CIPHER_CTX *enc_read_ctx; /* cryptographic state */ + const EVP_MD *read_hash; /* used for mac generation */ +#ifndef OPENSSL_NO_COMP + COMP_CTX *expand; /* uncompress */ +#else + char *expand; +#endif + + EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ + const EVP_MD *write_hash; /* used for mac generation */ +#ifndef OPENSSL_NO_COMP + COMP_CTX *compress; /* compression */ +#else + char *compress; +#endif + + /* session info */ + + /* client cert? */ + /* This is used to hold the server certificate used */ + struct cert_st /* CERT */ *cert; + + /* the session_id_context is used to ensure sessions are only reused + * in the appropriate context */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + + /* This can also be in the session once a session is established */ + SSL_SESSION *session; + + /* Default generate session ID callback. */ + GEN_SESSION_CB generate_session_id; + + /* Used in SSL2 and SSL3 */ + int verify_mode; /* 0 don't care about verify failure. + * 1 fail if verify fails */ + int (*verify_callback)(int ok,X509_STORE_CTX *ctx); /* fail if callback returns 0 */ + + void (*info_callback)(const SSL *ssl,int type,int val); /* optional informational callback */ + + int error; /* error bytes to be written */ + int error_code; /* actual code */ + +#ifndef OPENSSL_NO_KRB5 + KSSL_CTX *kssl_ctx; /* Kerberos 5 context */ +#endif /* OPENSSL_NO_KRB5 */ + + SSL_CTX *ctx; + /* set this flag to 1 and a sleep(1) is put into all SSL_read() + * and SSL_write() calls, good for nbio debuging :-) */ + int debug; + + /* extra application data */ + long verify_result; + CRYPTO_EX_DATA ex_data; + + /* for server side, keep the list of CA_dn we can use */ + STACK_OF(X509_NAME) *client_CA; + + int references; + unsigned long options; /* protocol behaviour */ + unsigned long mode; /* API behaviour */ + long max_cert_list; + int first_packet; + int client_version; /* what was passed, used for + * SSLv3/TLS rollback check */ +#ifndef OPENSSL_NO_TLSEXT + /* TLS extension debug callback */ + void (*tlsext_debug_cb)(SSL *s, int client_server, int type, + unsigned char *data, int len, + void *arg); + void *tlsext_debug_arg; + char *tlsext_hostname; + int servername_done; /* no further mod of servername + 0 : call the servername extension callback. + 1 : prepare 2, allow last ack just after in server callback. + 2 : don't call servername callback, no ack in server hello + */ + /* RFC4507 session ticket expected to be received or sent */ + int tlsext_ticket_expected; + SSL_CTX * initial_ctx; /* initial ctx, used to store sessions */ +#define session_ctx initial_ctx +#else +#define session_ctx ctx +#endif + }; + +#ifdef __cplusplus +} +#endif + +#include +#include +#include /* This is mostly sslv3 with a few tweaks */ +#include /* Datagram TLS */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* compatibility */ +#define SSL_set_app_data(s,arg) (SSL_set_ex_data(s,0,(char *)arg)) +#define SSL_get_app_data(s) (SSL_get_ex_data(s,0)) +#define SSL_SESSION_set_app_data(s,a) (SSL_SESSION_set_ex_data(s,0,(char *)a)) +#define SSL_SESSION_get_app_data(s) (SSL_SESSION_get_ex_data(s,0)) +#define SSL_CTX_get_app_data(ctx) (SSL_CTX_get_ex_data(ctx,0)) +#define SSL_CTX_set_app_data(ctx,arg) (SSL_CTX_set_ex_data(ctx,0,(char *)arg)) + +/* The following are the possible values for ssl->state are are + * used to indicate where we are up to in the SSL connection establishment. + * The macros that follow are about the only things you should need to use + * and even then, only when using non-blocking IO. + * It can also be useful to work out where you were when the connection + * failed */ + +#define SSL_ST_CONNECT 0x1000 +#define SSL_ST_ACCEPT 0x2000 +#define SSL_ST_MASK 0x0FFF +#define SSL_ST_INIT (SSL_ST_CONNECT|SSL_ST_ACCEPT) +#define SSL_ST_BEFORE 0x4000 +#define SSL_ST_OK 0x03 +#define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT) + +#define SSL_CB_LOOP 0x01 +#define SSL_CB_EXIT 0x02 +#define SSL_CB_READ 0x04 +#define SSL_CB_WRITE 0x08 +#define SSL_CB_ALERT 0x4000 /* used in callback */ +#define SSL_CB_READ_ALERT (SSL_CB_ALERT|SSL_CB_READ) +#define SSL_CB_WRITE_ALERT (SSL_CB_ALERT|SSL_CB_WRITE) +#define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT|SSL_CB_LOOP) +#define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT|SSL_CB_EXIT) +#define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT|SSL_CB_LOOP) +#define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT|SSL_CB_EXIT) +#define SSL_CB_HANDSHAKE_START 0x10 +#define SSL_CB_HANDSHAKE_DONE 0x20 + +/* Is the SSL_connection established? */ +#define SSL_get_state(a) SSL_state(a) +#define SSL_is_init_finished(a) (SSL_state(a) == SSL_ST_OK) +#define SSL_in_init(a) (SSL_state(a)&SSL_ST_INIT) +#define SSL_in_before(a) (SSL_state(a)&SSL_ST_BEFORE) +#define SSL_in_connect_init(a) (SSL_state(a)&SSL_ST_CONNECT) +#define SSL_in_accept_init(a) (SSL_state(a)&SSL_ST_ACCEPT) + +/* The following 2 states are kept in ssl->rstate when reads fail, + * you should not need these */ +#define SSL_ST_READ_HEADER 0xF0 +#define SSL_ST_READ_BODY 0xF1 +#define SSL_ST_READ_DONE 0xF2 + +/* Obtain latest Finished message + * -- that we sent (SSL_get_finished) + * -- that we expected from peer (SSL_get_peer_finished). + * Returns length (0 == no Finished so far), copies up to 'count' bytes. */ +size_t SSL_get_finished(const SSL *s, void *buf, size_t count); +size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count); + +/* use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 2 options + * are 'ored' with SSL_VERIFY_PEER if they are desired */ +#define SSL_VERIFY_NONE 0x00 +#define SSL_VERIFY_PEER 0x01 +#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 +#define SSL_VERIFY_CLIENT_ONCE 0x04 + +#define OpenSSL_add_ssl_algorithms() SSL_library_init() +#define SSLeay_add_ssl_algorithms() SSL_library_init() + +/* this is for backward compatibility */ +#if 0 /* NEW_SSLEAY */ +#define SSL_CTX_set_default_verify(a,b,c) SSL_CTX_set_verify(a,b,c) +#define SSL_set_pref_cipher(c,n) SSL_set_cipher_list(c,n) +#define SSL_add_session(a,b) SSL_CTX_add_session((a),(b)) +#define SSL_remove_session(a,b) SSL_CTX_remove_session((a),(b)) +#define SSL_flush_sessions(a,b) SSL_CTX_flush_sessions((a),(b)) +#endif +/* More backward compatibility */ +#define SSL_get_cipher(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +#define SSL_get_cipher_bits(s,np) \ + SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np) +#define SSL_get_cipher_version(s) \ + SSL_CIPHER_get_version(SSL_get_current_cipher(s)) +#define SSL_get_cipher_name(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +#define SSL_get_time(a) SSL_SESSION_get_time(a) +#define SSL_set_time(a,b) SSL_SESSION_set_time((a),(b)) +#define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) +#define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b)) + +#if 1 /*SSLEAY_MACROS*/ +#define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id) +#define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id) +#define PEM_read_SSL_SESSION(fp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read( \ + (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,fp,(char **)x,cb,u) +#define PEM_read_bio_SSL_SESSION(bp,x,cb,u) PEM_ASN1_read_bio_of(SSL_SESSION,d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,bp,x,cb,u) +#define PEM_write_SSL_SESSION(fp,x) \ + PEM_ASN1_write((int (*)())i2d_SSL_SESSION, \ + PEM_STRING_SSL_SESSION,fp, (char *)x, NULL,NULL,0,NULL,NULL) +#define PEM_write_bio_SSL_SESSION(bp,x) \ + PEM_ASN1_write_bio_of(SSL_SESSION,i2d_SSL_SESSION,PEM_STRING_SSL_SESSION,bp,x,NULL,NULL,0,NULL,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 */ +#define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC /* fatal */ +#define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED +#define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW +#define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE/* fatal */ +#define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE/* fatal */ +#define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE /* Not for TLS */ +#define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE +#define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE +#define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED +#define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED +#define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN +#define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER /* fatal */ +#define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA /* fatal */ +#define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED /* fatal */ +#define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR /* fatal */ +#define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR +#define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION/* fatal */ +#define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION /* fatal */ +#define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY/* fatal */ +#define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR /* fatal */ +#define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED +#define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION +#define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION +#define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE +#define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME + +#define SSL_ERROR_NONE 0 +#define SSL_ERROR_SSL 1 +#define SSL_ERROR_WANT_READ 2 +#define SSL_ERROR_WANT_WRITE 3 +#define SSL_ERROR_WANT_X509_LOOKUP 4 +#define SSL_ERROR_SYSCALL 5 /* look at error stack/return value/errno */ +#define SSL_ERROR_ZERO_RETURN 6 +#define SSL_ERROR_WANT_CONNECT 7 +#define SSL_ERROR_WANT_ACCEPT 8 + +#define SSL_CTRL_NEED_TMP_RSA 1 +#define SSL_CTRL_SET_TMP_RSA 2 +#define SSL_CTRL_SET_TMP_DH 3 +#define SSL_CTRL_SET_TMP_ECDH 4 +#define SSL_CTRL_SET_TMP_RSA_CB 5 +#define SSL_CTRL_SET_TMP_DH_CB 6 +#define SSL_CTRL_SET_TMP_ECDH_CB 7 + +#define SSL_CTRL_GET_SESSION_REUSED 8 +#define SSL_CTRL_GET_CLIENT_CERT_REQUEST 9 +#define SSL_CTRL_GET_NUM_RENEGOTIATIONS 10 +#define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 11 +#define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 12 +#define SSL_CTRL_GET_FLAGS 13 +#define SSL_CTRL_EXTRA_CHAIN_CERT 14 + +#define SSL_CTRL_SET_MSG_CALLBACK 15 +#define SSL_CTRL_SET_MSG_CALLBACK_ARG 16 + +/* only applies to datagram connections */ +#define SSL_CTRL_SET_MTU 17 +/* Stats */ +#define SSL_CTRL_SESS_NUMBER 20 +#define SSL_CTRL_SESS_CONNECT 21 +#define SSL_CTRL_SESS_CONNECT_GOOD 22 +#define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23 +#define SSL_CTRL_SESS_ACCEPT 24 +#define SSL_CTRL_SESS_ACCEPT_GOOD 25 +#define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26 +#define SSL_CTRL_SESS_HIT 27 +#define SSL_CTRL_SESS_CB_HIT 28 +#define SSL_CTRL_SESS_MISSES 29 +#define SSL_CTRL_SESS_TIMEOUTS 30 +#define SSL_CTRL_SESS_CACHE_FULL 31 +#define SSL_CTRL_OPTIONS 32 +#define SSL_CTRL_MODE 33 + +#define SSL_CTRL_GET_READ_AHEAD 40 +#define SSL_CTRL_SET_READ_AHEAD 41 +#define SSL_CTRL_SET_SESS_CACHE_SIZE 42 +#define SSL_CTRL_GET_SESS_CACHE_SIZE 43 +#define SSL_CTRL_SET_SESS_CACHE_MODE 44 +#define SSL_CTRL_GET_SESS_CACHE_MODE 45 + +#define SSL_CTRL_GET_MAX_CERT_LIST 50 +#define SSL_CTRL_SET_MAX_CERT_LIST 51 + +/* see tls1.h for macros based on these */ +#ifndef OPENSSL_NO_TLSEXT +#define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 53 +#define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG 54 +#define SSL_CTRL_SET_TLSEXT_HOSTNAME 55 +#define SSL_CTRL_SET_TLSEXT_DEBUG_CB 56 +#define SSL_CTRL_SET_TLSEXT_DEBUG_ARG 57 +#define SSL_CTRL_GET_TLSEXT_TICKET_KEYS 58 +#define SSL_CTRL_SET_TLSEXT_TICKET_KEYS 59 +#endif + +#define SSL_session_reused(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL) +#define SSL_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL) +#define SSL_clear_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL) +#define SSL_total_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL) + +#define SSL_CTX_need_tmp_RSA(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_NEED_TMP_RSA,0,NULL) +#define SSL_CTX_set_tmp_rsa(ctx,rsa) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +#define SSL_CTX_set_tmp_dh(ctx,dh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +#define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) + +#define SSL_need_tmp_RSA(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_NEED_TMP_RSA,0,NULL) +#define SSL_set_tmp_rsa(ssl,rsa) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +#define SSL_set_tmp_dh(ssl,dh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +#define SSL_set_tmp_ecdh(ssl,ecdh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) + +#define SSL_CTX_add_extra_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509) + +#ifndef OPENSSL_NO_BIO +BIO_METHOD *BIO_f_ssl(void); +BIO *BIO_new_ssl(SSL_CTX *ctx,int client); +BIO *BIO_new_ssl_connect(SSL_CTX *ctx); +BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); +int BIO_ssl_copy_session_id(BIO *to,BIO *from); +void BIO_ssl_shutdown(BIO *ssl_bio); + +#endif + +int SSL_CTX_set_cipher_list(SSL_CTX *,const char *str); +SSL_CTX *SSL_CTX_new(SSL_METHOD *meth); +void SSL_CTX_free(SSL_CTX *); +long SSL_CTX_set_timeout(SSL_CTX *ctx,long t); +long SSL_CTX_get_timeout(const SSL_CTX *ctx); +X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); +void SSL_CTX_set_cert_store(SSL_CTX *,X509_STORE *); +int SSL_want(const SSL *s); +int SSL_clear(SSL *s); + +void SSL_CTX_flush_sessions(SSL_CTX *ctx,long tm); + +SSL_CIPHER *SSL_get_current_cipher(const SSL *s); +int SSL_CIPHER_get_bits(const SSL_CIPHER *c,int *alg_bits); +char * SSL_CIPHER_get_version(const SSL_CIPHER *c); +const char * SSL_CIPHER_get_name(const SSL_CIPHER *c); + +int SSL_get_fd(const SSL *s); +int SSL_get_rfd(const SSL *s); +int SSL_get_wfd(const SSL *s); +const char * SSL_get_cipher_list(const SSL *s,int n); +char * SSL_get_shared_ciphers(const SSL *s, char *buf, int len); +int SSL_get_read_ahead(const SSL * s); +int SSL_pending(const SSL *s); +#ifndef OPENSSL_NO_SOCK +int SSL_set_fd(SSL *s, int fd); +int SSL_set_rfd(SSL *s, int fd); +int SSL_set_wfd(SSL *s, int fd); +#endif +#ifndef OPENSSL_NO_BIO +void SSL_set_bio(SSL *s, BIO *rbio,BIO *wbio); +BIO * SSL_get_rbio(const SSL *s); +BIO * SSL_get_wbio(const SSL *s); +#endif +int SSL_set_cipher_list(SSL *s, const char *str); +void SSL_set_read_ahead(SSL *s, int yes); +int SSL_get_verify_mode(const SSL *s); +int SSL_get_verify_depth(const SSL *s); +int (*SSL_get_verify_callback(const SSL *s))(int,X509_STORE_CTX *); +void SSL_set_verify(SSL *s, int mode, + int (*callback)(int ok,X509_STORE_CTX *ctx)); +void SSL_set_verify_depth(SSL *s, int depth); +#ifndef OPENSSL_NO_RSA +int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); +#endif +int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len); +int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); +int SSL_use_PrivateKey_ASN1(int pk,SSL *ssl, const unsigned char *d, long len); +int SSL_use_certificate(SSL *ssl, X509 *x); +int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len); + +#ifndef OPENSSL_NO_STDIO +int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_certificate_file(SSL *ssl, const char *file, int type); +int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); /* PEM type */ +STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); +int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *file); +#ifndef OPENSSL_SYS_VMS +#ifndef OPENSSL_SYS_MACINTOSH_CLASSIC /* XXXXX: Better scheme needed! [was: #ifndef MAC_OS_pre_X] */ +int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *dir); +#endif +#endif + +#endif + +void SSL_load_error_strings(void ); +const char *SSL_state_string(const SSL *s); +const char *SSL_rstate_string(const SSL *s); +const char *SSL_state_string_long(const SSL *s); +const char *SSL_rstate_string_long(const SSL *s); +long SSL_SESSION_get_time(const SSL_SESSION *s); +long SSL_SESSION_set_time(SSL_SESSION *s, long t); +long SSL_SESSION_get_timeout(const SSL_SESSION *s); +long SSL_SESSION_set_timeout(SSL_SESSION *s, long t); +void SSL_copy_session_id(SSL *to,const SSL *from); + +SSL_SESSION *SSL_SESSION_new(void); +unsigned long SSL_SESSION_hash(const SSL_SESSION *a); +int SSL_SESSION_cmp(const SSL_SESSION *a,const SSL_SESSION *b); +const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, unsigned int *len); +#ifndef OPENSSL_NO_FP_API +int SSL_SESSION_print_fp(FILE *fp,const SSL_SESSION *ses); +#endif +#ifndef OPENSSL_NO_BIO +int SSL_SESSION_print(BIO *fp,const SSL_SESSION *ses); +#endif +void SSL_SESSION_free(SSL_SESSION *ses); +int i2d_SSL_SESSION(SSL_SESSION *in,unsigned char **pp); +int SSL_set_session(SSL *to, SSL_SESSION *session); +int SSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c); +int SSL_CTX_remove_session(SSL_CTX *,SSL_SESSION *c); +int SSL_CTX_set_generate_session_id(SSL_CTX *, GEN_SESSION_CB); +int SSL_set_generate_session_id(SSL *, GEN_SESSION_CB); +int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id, + unsigned int id_len); +SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a,const unsigned char **pp, + long length); + +#ifdef HEADER_X509_H +X509 * SSL_get_peer_certificate(const SSL *s); +#endif + +STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s); + +int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); +int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); +int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(int,X509_STORE_CTX *); +void SSL_CTX_set_verify(SSL_CTX *ctx,int mode, + int (*callback)(int, X509_STORE_CTX *)); +void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth); +void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *,void *), void *arg); +#ifndef OPENSSL_NO_RSA +int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); +#endif +int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, long len); +int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); +int SSL_CTX_use_PrivateKey_ASN1(int pk,SSL_CTX *ctx, + const unsigned char *d, long len); +int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); +int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, const unsigned char *d); + +void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); +void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); + +int SSL_CTX_check_private_key(const SSL_CTX *ctx); +int SSL_check_private_key(const SSL *ctx); + +int SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL * SSL_new(SSL_CTX *ctx); +int SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +int SSL_CTX_set_purpose(SSL_CTX *s, int purpose); +int SSL_set_purpose(SSL *s, int purpose); +int SSL_CTX_set_trust(SSL_CTX *s, int trust); +int SSL_set_trust(SSL *s, int trust); + +void SSL_free(SSL *ssl); +int SSL_accept(SSL *ssl); +int SSL_connect(SSL *ssl); +int SSL_read(SSL *ssl,void *buf,int num); +int SSL_peek(SSL *ssl,void *buf,int num); +int SSL_write(SSL *ssl,const void *buf,int num); +long SSL_ctrl(SSL *ssl,int cmd, long larg, void *parg); +long SSL_callback_ctrl(SSL *, int, void (*)(void)); +long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd, long larg, void *parg); +long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void)); + +int SSL_get_error(const SSL *s,int ret_code); +const char *SSL_get_version(const SSL *s); + +/* This sets the 'default' SSL version that SSL_new() will create */ +int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth); + +SSL_METHOD *SSLv2_method(void); /* SSLv2 */ +SSL_METHOD *SSLv2_server_method(void); /* SSLv2 */ +SSL_METHOD *SSLv2_client_method(void); /* SSLv2 */ + +SSL_METHOD *SSLv3_method(void); /* SSLv3 */ +SSL_METHOD *SSLv3_server_method(void); /* SSLv3 */ +SSL_METHOD *SSLv3_client_method(void); /* SSLv3 */ + +SSL_METHOD *SSLv23_method(void); /* SSLv3 but can rollback to v2 */ +SSL_METHOD *SSLv23_server_method(void); /* SSLv3 but can rollback to v2 */ +SSL_METHOD *SSLv23_client_method(void); /* SSLv3 but can rollback to v2 */ + +SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */ +SSL_METHOD *TLSv1_server_method(void); /* TLSv1.0 */ +SSL_METHOD *TLSv1_client_method(void); /* TLSv1.0 */ + +SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */ +SSL_METHOD *DTLSv1_server_method(void); /* DTLSv1.0 */ +SSL_METHOD *DTLSv1_client_method(void); /* DTLSv1.0 */ + +STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s); + +int SSL_do_handshake(SSL *s); +int SSL_renegotiate(SSL *s); +int SSL_renegotiate_pending(SSL *s); +int SSL_shutdown(SSL *s); + +SSL_METHOD *SSL_get_ssl_method(SSL *s); +int SSL_set_ssl_method(SSL *s,SSL_METHOD *method); +const char *SSL_alert_type_string_long(int value); +const char *SSL_alert_type_string(int value); +const char *SSL_alert_desc_string_long(int value); +const char *SSL_alert_desc_string(int value); + +void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s); +STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s); +int SSL_add_client_CA(SSL *ssl,X509 *x); +int SSL_CTX_add_client_CA(SSL_CTX *ctx,X509 *x); + +void SSL_set_connect_state(SSL *s); +void SSL_set_accept_state(SSL *s); + +long SSL_get_default_timeout(const SSL *s); + +int SSL_library_init(void ); + +char *SSL_CIPHER_description(SSL_CIPHER *,char *buf,int size); +STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk); + +SSL *SSL_dup(SSL *ssl); + +X509 *SSL_get_certificate(const SSL *ssl); +/* EVP_PKEY */ struct evp_pkey_st *SSL_get_privatekey(SSL *ssl); + +void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode); +int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); +void SSL_set_quiet_shutdown(SSL *ssl,int mode); +int SSL_get_quiet_shutdown(const SSL *ssl); +void SSL_set_shutdown(SSL *ssl,int mode); +int SSL_get_shutdown(const SSL *ssl); +int SSL_version(const SSL *ssl); +int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); +int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, + const char *CApath); +#define SSL_get0_session SSL_get_session /* just peek at pointer */ +SSL_SESSION *SSL_get_session(const SSL *ssl); +SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */ +SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); +SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX* ctx); +void SSL_set_info_callback(SSL *ssl, + void (*cb)(const SSL *ssl,int type,int val)); +void (*SSL_get_info_callback(const SSL *ssl))(const SSL *ssl,int type,int val); +int SSL_state(const SSL *ssl); + +void SSL_set_verify_result(SSL *ssl,long v); +long SSL_get_verify_result(const SSL *ssl); + +int SSL_set_ex_data(SSL *ssl,int idx,void *data); +void *SSL_get_ex_data(const SSL *ssl,int idx); +int SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); + +int SSL_SESSION_set_ex_data(SSL_SESSION *ss,int idx,void *data); +void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss,int idx); +int SSL_SESSION_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); + +int SSL_CTX_set_ex_data(SSL_CTX *ssl,int idx,void *data); +void *SSL_CTX_get_ex_data(const SSL_CTX *ssl,int idx); +int SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); + +int SSL_get_ex_data_X509_STORE_CTX_idx(void ); + +#define SSL_CTX_sess_set_cache_size(ctx,t) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL) +#define SSL_CTX_sess_get_cache_size(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL) +#define SSL_CTX_set_session_cache_mode(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL) +#define SSL_CTX_get_session_cache_mode(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL) + +#define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx) +#define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m) +#define SSL_CTX_get_read_ahead(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL) +#define SSL_CTX_set_read_ahead(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL) +#define SSL_CTX_get_max_cert_list(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +#define SSL_CTX_set_max_cert_list(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) +#define SSL_get_max_cert_list(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +#define SSL_set_max_cert_list(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) + + /* NB: the keylength is only applicable when is_export is true */ +#ifndef OPENSSL_NO_RSA +void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx, + RSA *(*cb)(SSL *ssl,int is_export, + int keylength)); + +void SSL_set_tmp_rsa_callback(SSL *ssl, + RSA *(*cb)(SSL *ssl,int is_export, + int keylength)); +#endif +#ifndef OPENSSL_NO_DH +void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, + DH *(*dh)(SSL *ssl,int is_export, + int keylength)); +void SSL_set_tmp_dh_callback(SSL *ssl, + DH *(*dh)(SSL *ssl,int is_export, + int keylength)); +#endif +#ifndef OPENSSL_NO_ECDH +void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, + EC_KEY *(*ecdh)(SSL *ssl,int is_export, + int keylength)); +void SSL_set_tmp_ecdh_callback(SSL *ssl, + EC_KEY *(*ecdh)(SSL *ssl,int is_export, + int keylength)); +#endif + +#ifndef OPENSSL_NO_COMP +const COMP_METHOD *SSL_get_current_compression(SSL *s); +const COMP_METHOD *SSL_get_current_expansion(SSL *s); +const char *SSL_COMP_get_name(const COMP_METHOD *comp); +STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void); +int SSL_COMP_add_compression_method(int id,COMP_METHOD *cm); +#else +const void *SSL_get_current_compression(SSL *s); +const void *SSL_get_current_expansion(SSL *s); +const char *SSL_COMP_get_name(const void *comp); +void *SSL_COMP_get_compression_methods(void); +int SSL_COMP_add_compression_method(int id,void *cm); +#endif + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_SSL_strings(void); + +/* Error codes for the SSL functions. */ + +/* Function codes. */ +#define SSL_F_CLIENT_CERTIFICATE 100 +#define SSL_F_CLIENT_FINISHED 167 +#define SSL_F_CLIENT_HELLO 101 +#define SSL_F_CLIENT_MASTER_KEY 102 +#define SSL_F_D2I_SSL_SESSION 103 +#define SSL_F_DO_DTLS1_WRITE 245 +#define SSL_F_DO_SSL3_WRITE 104 +#define SSL_F_DTLS1_ACCEPT 246 +#define SSL_F_DTLS1_BUFFER_RECORD 247 +#define SSL_F_DTLS1_CLIENT_HELLO 248 +#define SSL_F_DTLS1_CONNECT 249 +#define SSL_F_DTLS1_ENC 250 +#define SSL_F_DTLS1_GET_HELLO_VERIFY 251 +#define SSL_F_DTLS1_GET_MESSAGE 252 +#define SSL_F_DTLS1_GET_MESSAGE_FRAGMENT 253 +#define SSL_F_DTLS1_GET_RECORD 254 +#define SSL_F_DTLS1_OUTPUT_CERT_CHAIN 255 +#define SSL_F_DTLS1_PREPROCESS_FRAGMENT 277 +#define SSL_F_DTLS1_PROCESS_OUT_OF_SEQ_MESSAGE 256 +#define SSL_F_DTLS1_PROCESS_RECORD 257 +#define SSL_F_DTLS1_READ_BYTES 258 +#define SSL_F_DTLS1_READ_FAILED 259 +#define SSL_F_DTLS1_SEND_CERTIFICATE_REQUEST 260 +#define SSL_F_DTLS1_SEND_CLIENT_CERTIFICATE 261 +#define SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE 262 +#define SSL_F_DTLS1_SEND_CLIENT_VERIFY 263 +#define SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST 264 +#define SSL_F_DTLS1_SEND_SERVER_CERTIFICATE 265 +#define SSL_F_DTLS1_SEND_SERVER_HELLO 266 +#define SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE 267 +#define SSL_F_DTLS1_WRITE_APP_DATA_BYTES 268 +#define SSL_F_GET_CLIENT_FINISHED 105 +#define SSL_F_GET_CLIENT_HELLO 106 +#define SSL_F_GET_CLIENT_MASTER_KEY 107 +#define SSL_F_GET_SERVER_FINISHED 108 +#define SSL_F_GET_SERVER_HELLO 109 +#define SSL_F_GET_SERVER_VERIFY 110 +#define SSL_F_I2D_SSL_SESSION 111 +#define SSL_F_READ_N 112 +#define SSL_F_REQUEST_CERTIFICATE 113 +#define SSL_F_SERVER_FINISH 239 +#define SSL_F_SERVER_HELLO 114 +#define SSL_F_SERVER_VERIFY 240 +#define SSL_F_SSL23_ACCEPT 115 +#define SSL_F_SSL23_CLIENT_HELLO 116 +#define SSL_F_SSL23_CONNECT 117 +#define SSL_F_SSL23_GET_CLIENT_HELLO 118 +#define SSL_F_SSL23_GET_SERVER_HELLO 119 +#define SSL_F_SSL23_PEEK 237 +#define SSL_F_SSL23_READ 120 +#define SSL_F_SSL23_WRITE 121 +#define SSL_F_SSL2_ACCEPT 122 +#define SSL_F_SSL2_CONNECT 123 +#define SSL_F_SSL2_ENC_INIT 124 +#define SSL_F_SSL2_GENERATE_KEY_MATERIAL 241 +#define SSL_F_SSL2_PEEK 234 +#define SSL_F_SSL2_READ 125 +#define SSL_F_SSL2_READ_INTERNAL 236 +#define SSL_F_SSL2_SET_CERTIFICATE 126 +#define SSL_F_SSL2_WRITE 127 +#define SSL_F_SSL3_ACCEPT 128 +#define SSL_F_SSL3_CALLBACK_CTRL 233 +#define SSL_F_SSL3_CHANGE_CIPHER_STATE 129 +#define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130 +#define SSL_F_SSL3_CLIENT_HELLO 131 +#define SSL_F_SSL3_CONNECT 132 +#define SSL_F_SSL3_CTRL 213 +#define SSL_F_SSL3_CTX_CTRL 133 +#define SSL_F_SSL3_ENC 134 +#define SSL_F_SSL3_GENERATE_KEY_BLOCK 238 +#define SSL_F_SSL3_GET_CERTIFICATE_REQUEST 135 +#define SSL_F_SSL3_GET_CERT_VERIFY 136 +#define SSL_F_SSL3_GET_CLIENT_CERTIFICATE 137 +#define SSL_F_SSL3_GET_CLIENT_HELLO 138 +#define SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE 139 +#define SSL_F_SSL3_GET_FINISHED 140 +#define SSL_F_SSL3_GET_KEY_EXCHANGE 141 +#define SSL_F_SSL3_GET_MESSAGE 142 +#define SSL_F_SSL3_GET_NEW_SESSION_TICKET 283 +#define SSL_F_SSL3_GET_RECORD 143 +#define SSL_F_SSL3_GET_SERVER_CERTIFICATE 144 +#define SSL_F_SSL3_GET_SERVER_DONE 145 +#define SSL_F_SSL3_GET_SERVER_HELLO 146 +#define SSL_F_SSL3_NEW_SESSION_TICKET 284 +#define SSL_F_SSL3_OUTPUT_CERT_CHAIN 147 +#define SSL_F_SSL3_PEEK 235 +#define SSL_F_SSL3_READ_BYTES 148 +#define SSL_F_SSL3_READ_N 149 +#define SSL_F_SSL3_SEND_CERTIFICATE_REQUEST 150 +#define SSL_F_SSL3_SEND_CLIENT_CERTIFICATE 151 +#define SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE 152 +#define SSL_F_SSL3_SEND_CLIENT_VERIFY 153 +#define SSL_F_SSL3_SEND_SERVER_CERTIFICATE 154 +#define SSL_F_SSL3_SEND_SERVER_HELLO 242 +#define SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE 155 +#define SSL_F_SSL3_SETUP_BUFFERS 156 +#define SSL_F_SSL3_SETUP_KEY_BLOCK 157 +#define SSL_F_SSL3_WRITE_BYTES 158 +#define SSL_F_SSL3_WRITE_PENDING 159 +#define SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT 272 +#define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK 215 +#define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK 216 +#define SSL_F_SSL_ADD_SERVERHELLO_TLSEXT 273 +#define SSL_F_SSL_BAD_METHOD 160 +#define SSL_F_SSL_BYTES_TO_CIPHER_LIST 161 +#define SSL_F_SSL_CERT_DUP 221 +#define SSL_F_SSL_CERT_INST 222 +#define SSL_F_SSL_CERT_INSTANTIATE 214 +#define SSL_F_SSL_CERT_NEW 162 +#define SSL_F_SSL_CHECK_PRIVATE_KEY 163 +#define SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT 274 +#define SSL_F_SSL_CIPHER_PROCESS_RULESTR 230 +#define SSL_F_SSL_CIPHER_STRENGTH_SORT 231 +#define SSL_F_SSL_CLEAR 164 +#define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD 165 +#define SSL_F_SSL_CREATE_CIPHER_LIST 166 +#define SSL_F_SSL_CTRL 232 +#define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168 +#define SSL_F_SSL_CTX_NEW 169 +#define SSL_F_SSL_CTX_SET_CIPHER_LIST 269 +#define SSL_F_SSL_CTX_SET_PURPOSE 226 +#define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 219 +#define SSL_F_SSL_CTX_SET_SSL_VERSION 170 +#define SSL_F_SSL_CTX_SET_TRUST 229 +#define SSL_F_SSL_CTX_USE_CERTIFICATE 171 +#define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 172 +#define SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE 220 +#define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 173 +#define SSL_F_SSL_CTX_USE_PRIVATEKEY 174 +#define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 175 +#define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 176 +#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 177 +#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 178 +#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 179 +#define SSL_F_SSL_DO_HANDSHAKE 180 +#define SSL_F_SSL_GET_NEW_SESSION 181 +#define SSL_F_SSL_GET_PREV_SESSION 217 +#define SSL_F_SSL_GET_SERVER_SEND_CERT 182 +#define SSL_F_SSL_GET_SIGN_PKEY 183 +#define SSL_F_SSL_INIT_WBIO_BUFFER 184 +#define SSL_F_SSL_LOAD_CLIENT_CA_FILE 185 +#define SSL_F_SSL_NEW 186 +#define SSL_F_SSL_PEEK 270 +#define SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT 275 +#define SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT 276 +#define SSL_F_SSL_READ 223 +#define SSL_F_SSL_RSA_PRIVATE_DECRYPT 187 +#define SSL_F_SSL_RSA_PUBLIC_ENCRYPT 188 +#define SSL_F_SSL_SESSION_NEW 189 +#define SSL_F_SSL_SESSION_PRINT_FP 190 +#define SSL_F_SSL_SESS_CERT_NEW 225 +#define SSL_F_SSL_SET_CERT 191 +#define SSL_F_SSL_SET_CIPHER_LIST 271 +#define SSL_F_SSL_SET_FD 192 +#define SSL_F_SSL_SET_PKEY 193 +#define SSL_F_SSL_SET_PURPOSE 227 +#define SSL_F_SSL_SET_RFD 194 +#define SSL_F_SSL_SET_SESSION 195 +#define SSL_F_SSL_SET_SESSION_ID_CONTEXT 218 +#define SSL_F_SSL_SET_TRUST 228 +#define SSL_F_SSL_SET_WFD 196 +#define SSL_F_SSL_SHUTDOWN 224 +#define SSL_F_SSL_UNDEFINED_CONST_FUNCTION 243 +#define SSL_F_SSL_UNDEFINED_FUNCTION 197 +#define SSL_F_SSL_UNDEFINED_VOID_FUNCTION 244 +#define SSL_F_SSL_USE_CERTIFICATE 198 +#define SSL_F_SSL_USE_CERTIFICATE_ASN1 199 +#define SSL_F_SSL_USE_CERTIFICATE_FILE 200 +#define SSL_F_SSL_USE_PRIVATEKEY 201 +#define SSL_F_SSL_USE_PRIVATEKEY_ASN1 202 +#define SSL_F_SSL_USE_PRIVATEKEY_FILE 203 +#define SSL_F_SSL_USE_RSAPRIVATEKEY 204 +#define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1 205 +#define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE 206 +#define SSL_F_SSL_VERIFY_CERT_CHAIN 207 +#define SSL_F_SSL_WRITE 208 +#define SSL_F_TLS1_CHANGE_CIPHER_STATE 209 +#define SSL_F_TLS1_ENC 210 +#define SSL_F_TLS1_SETUP_KEY_BLOCK 211 +#define SSL_F_WRITE_PENDING 212 + +/* Reason codes. */ +#define SSL_R_APP_DATA_IN_HANDSHAKE 100 +#define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272 +#define SSL_R_BAD_ALERT_RECORD 101 +#define SSL_R_BAD_AUTHENTICATION_TYPE 102 +#define SSL_R_BAD_CHANGE_CIPHER_SPEC 103 +#define SSL_R_BAD_CHECKSUM 104 +#define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106 +#define SSL_R_BAD_DECOMPRESSION 107 +#define SSL_R_BAD_DH_G_LENGTH 108 +#define SSL_R_BAD_DH_PUB_KEY_LENGTH 109 +#define SSL_R_BAD_DH_P_LENGTH 110 +#define SSL_R_BAD_DIGEST_LENGTH 111 +#define SSL_R_BAD_DSA_SIGNATURE 112 +#define SSL_R_BAD_ECC_CERT 304 +#define SSL_R_BAD_ECDSA_SIGNATURE 305 +#define SSL_R_BAD_ECPOINT 306 +#define SSL_R_BAD_HELLO_REQUEST 105 +#define SSL_R_BAD_LENGTH 271 +#define SSL_R_BAD_MAC_DECODE 113 +#define SSL_R_BAD_MESSAGE_TYPE 114 +#define SSL_R_BAD_PACKET_LENGTH 115 +#define SSL_R_BAD_PROTOCOL_VERSION_NUMBER 116 +#define SSL_R_BAD_RESPONSE_ARGUMENT 117 +#define SSL_R_BAD_RSA_DECRYPT 118 +#define SSL_R_BAD_RSA_ENCRYPT 119 +#define SSL_R_BAD_RSA_E_LENGTH 120 +#define SSL_R_BAD_RSA_MODULUS_LENGTH 121 +#define SSL_R_BAD_RSA_SIGNATURE 122 +#define SSL_R_BAD_SIGNATURE 123 +#define SSL_R_BAD_SSL_FILETYPE 124 +#define SSL_R_BAD_SSL_SESSION_ID_LENGTH 125 +#define SSL_R_BAD_STATE 126 +#define SSL_R_BAD_WRITE_RETRY 127 +#define SSL_R_BIO_NOT_SET 128 +#define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG 129 +#define SSL_R_BN_LIB 130 +#define SSL_R_CA_DN_LENGTH_MISMATCH 131 +#define SSL_R_CA_DN_TOO_LONG 132 +#define SSL_R_CCS_RECEIVED_EARLY 133 +#define SSL_R_CERTIFICATE_VERIFY_FAILED 134 +#define SSL_R_CERT_LENGTH_MISMATCH 135 +#define SSL_R_CHALLENGE_IS_DIFFERENT 136 +#define SSL_R_CIPHER_CODE_WRONG_LENGTH 137 +#define SSL_R_CIPHER_OR_HASH_UNAVAILABLE 138 +#define SSL_R_CIPHER_TABLE_SRC_ERROR 139 +#define SSL_R_CLIENTHELLO_TLSEXT 157 +#define SSL_R_COMPRESSED_LENGTH_TOO_LONG 140 +#define SSL_R_COMPRESSION_FAILURE 141 +#define SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE 307 +#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_COOKIE_MISMATCH 308 +#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_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 281 +#define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 148 +#define SSL_R_DIGEST_CHECK_FAILED 149 +#define SSL_R_DUPLICATE_COMPRESSION_ID 309 +#define SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER 310 +#define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 150 +#define SSL_R_ERROR_GENERATING_TMP_RSA_KEY 282 +#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_ILLEGAL_PADDING 283 +#define SSL_R_INVALID_CHALLENGE_LENGTH 158 +#define SSL_R_INVALID_COMMAND 280 +#define SSL_R_INVALID_PURPOSE 278 +#define SSL_R_INVALID_TICKET_KEYS_LENGTH 275 +#define SSL_R_INVALID_TRUST 279 +#define SSL_R_KEY_ARG_TOO_LONG 284 +#define SSL_R_KRB5 285 +#define SSL_R_KRB5_C_CC_PRINC 286 +#define SSL_R_KRB5_C_GET_CRED 287 +#define SSL_R_KRB5_C_INIT 288 +#define SSL_R_KRB5_C_MK_REQ 289 +#define SSL_R_KRB5_S_BAD_TICKET 290 +#define SSL_R_KRB5_S_INIT 291 +#define SSL_R_KRB5_S_RD_REQ 292 +#define SSL_R_KRB5_S_TKT_EXPIRED 293 +#define SSL_R_KRB5_S_TKT_NYV 294 +#define SSL_R_KRB5_S_TKT_SKEW 295 +#define SSL_R_LENGTH_MISMATCH 159 +#define SSL_R_LENGTH_TOO_SHORT 160 +#define SSL_R_LIBRARY_BUG 274 +#define SSL_R_LIBRARY_HAS_NO_CIPHERS 161 +#define SSL_R_MESSAGE_TOO_LONG 296 +#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_ECDH_KEY 311 +#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_METHOD_SPECIFIED 188 +#define SSL_R_NO_PRIVATEKEY 189 +#define SSL_R_NO_PRIVATE_KEY_ASSIGNED 190 +#define SSL_R_NO_PROTOCOLS_AVAILABLE 191 +#define SSL_R_NO_PUBLICKEY 192 +#define SSL_R_NO_SHARED_CIPHER 193 +#define SSL_R_NO_VERIFY_CALLBACK 194 +#define SSL_R_NULL_SSL_CTX 195 +#define SSL_R_NULL_SSL_METHOD_PASSED 196 +#define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 197 +#define SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE 297 +#define SSL_R_PACKET_LENGTH_TOO_LONG 198 +#define SSL_R_PARSE_TLSEXT 223 +#define SSL_R_PATH_TOO_LONG 270 +#define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 199 +#define SSL_R_PEER_ERROR 200 +#define SSL_R_PEER_ERROR_CERTIFICATE 201 +#define SSL_R_PEER_ERROR_NO_CERTIFICATE 202 +#define SSL_R_PEER_ERROR_NO_CIPHER 203 +#define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 204 +#define SSL_R_PRE_MAC_LENGTH_TOO_LONG 205 +#define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS 206 +#define SSL_R_PROTOCOL_IS_SHUTDOWN 207 +#define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR 208 +#define SSL_R_PUBLIC_KEY_IS_NOT_RSA 209 +#define SSL_R_PUBLIC_KEY_NOT_RSA 210 +#define SSL_R_READ_BIO_NOT_SET 211 +#define SSL_R_READ_TIMEOUT_EXPIRED 312 +#define SSL_R_READ_WRONG_PACKET_TYPE 212 +#define SSL_R_RECORD_LENGTH_MISMATCH 213 +#define SSL_R_RECORD_TOO_LARGE 214 +#define SSL_R_RECORD_TOO_SMALL 298 +#define SSL_R_REQUIRED_CIPHER_MISSING 215 +#define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO 216 +#define SSL_R_REUSE_CERT_TYPE_NOT_ZERO 217 +#define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO 218 +#define SSL_R_SERVERHELLO_TLSEXT 224 +#define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 277 +#define SSL_R_SHORT_READ 219 +#define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE 220 +#define SSL_R_SSL23_DOING_SESSION_ID_REUSE 221 +#define SSL_R_SSL2_CONNECTION_ID_TOO_LONG 299 +#define SSL_R_SSL3_EXT_INVALID_SERVERNAME 225 +#define SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE 226 +#define SSL_R_SSL3_SESSION_ID_TOO_LONG 300 +#define SSL_R_SSL3_SESSION_ID_TOO_SHORT 222 +#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_CERTIFICATE_REVOKED 1044 +#define SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN 1046 +#define SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE 1030 +#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_UNEXPECTED_MESSAGE 1010 +#define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043 +#define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 228 +#define SSL_R_SSL_HANDSHAKE_FAILURE 229 +#define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS 230 +#define SSL_R_SSL_SESSION_ID_CALLBACK_FAILED 301 +#define SSL_R_SSL_SESSION_ID_CONFLICT 302 +#define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG 273 +#define SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH 303 +#define SSL_R_SSL_SESSION_ID_IS_DIFFERENT 231 +#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_RESTRICTION 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_CANCELLED 1090 +#define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER 232 +#define SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST 227 +#define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 233 +#define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG 234 +#define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER 235 +#define SSL_R_UNABLE_TO_DECODE_DH_CERTS 236 +#define SSL_R_UNABLE_TO_DECODE_ECDH_CERTS 313 +#define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY 237 +#define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS 238 +#define SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS 314 +#define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 239 +#define SSL_R_UNABLE_TO_FIND_SSL_METHOD 240 +#define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES 241 +#define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 242 +#define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 243 +#define SSL_R_UNEXPECTED_MESSAGE 244 +#define SSL_R_UNEXPECTED_RECORD 245 +#define SSL_R_UNINITIALIZED 276 +#define SSL_R_UNKNOWN_ALERT_TYPE 246 +#define SSL_R_UNKNOWN_CERTIFICATE_TYPE 247 +#define SSL_R_UNKNOWN_CIPHER_RETURNED 248 +#define SSL_R_UNKNOWN_CIPHER_TYPE 249 +#define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 250 +#define SSL_R_UNKNOWN_PKEY_TYPE 251 +#define SSL_R_UNKNOWN_PROTOCOL 252 +#define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE 253 +#define SSL_R_UNKNOWN_SSL_VERSION 254 +#define SSL_R_UNKNOWN_STATE 255 +#define SSL_R_UNSUPPORTED_CIPHER 256 +#define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 257 +#define SSL_R_UNSUPPORTED_ELLIPTIC_CURVE 315 +#define SSL_R_UNSUPPORTED_PROTOCOL 258 +#define SSL_R_UNSUPPORTED_SSL_VERSION 259 +#define SSL_R_WRITE_BIO_NOT_SET 260 +#define SSL_R_WRONG_CIPHER_RETURNED 261 +#define SSL_R_WRONG_MESSAGE_TYPE 262 +#define SSL_R_WRONG_NUMBER_OF_KEY_BITS 263 +#define SSL_R_WRONG_SIGNATURE_LENGTH 264 +#define SSL_R_WRONG_SIGNATURE_SIZE 265 +#define SSL_R_WRONG_SSL_VERSION 266 +#define SSL_R_WRONG_VERSION_NUMBER 267 +#define SSL_R_X509_LIB 268 +#define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 269 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/ssl2.h b/mswin32/OpenSSL/include/openssl/ssl2.h new file mode 100755 index 000000000..99a52ea0d --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ssl2.h @@ -0,0 +1,268 @@ +/* ssl/ssl2.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.] + */ + +#ifndef HEADER_SSL2_H +#define HEADER_SSL2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Protocol Version Codes */ +#define SSL2_VERSION 0x0002 +#define SSL2_VERSION_MAJOR 0x00 +#define SSL2_VERSION_MINOR 0x02 +/* #define SSL2_CLIENT_VERSION 0x0002 */ +/* #define SSL2_SERVER_VERSION 0x0002 */ + +/* Protocol Message Codes */ +#define SSL2_MT_ERROR 0 +#define SSL2_MT_CLIENT_HELLO 1 +#define SSL2_MT_CLIENT_MASTER_KEY 2 +#define SSL2_MT_CLIENT_FINISHED 3 +#define SSL2_MT_SERVER_HELLO 4 +#define SSL2_MT_SERVER_VERIFY 5 +#define SSL2_MT_SERVER_FINISHED 6 +#define SSL2_MT_REQUEST_CERTIFICATE 7 +#define SSL2_MT_CLIENT_CERTIFICATE 8 + +/* Error Message Codes */ +#define SSL2_PE_UNDEFINED_ERROR 0x0000 +#define SSL2_PE_NO_CIPHER 0x0001 +#define SSL2_PE_NO_CERTIFICATE 0x0002 +#define SSL2_PE_BAD_CERTIFICATE 0x0004 +#define SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE 0x0006 + +/* Cipher Kind Values */ +#define SSL2_CK_NULL_WITH_MD5 0x02000000 /* v3 */ +#define SSL2_CK_RC4_128_WITH_MD5 0x02010080 +#define SSL2_CK_RC4_128_EXPORT40_WITH_MD5 0x02020080 +#define SSL2_CK_RC2_128_CBC_WITH_MD5 0x02030080 +#define SSL2_CK_RC2_128_CBC_EXPORT40_WITH_MD5 0x02040080 +#define SSL2_CK_IDEA_128_CBC_WITH_MD5 0x02050080 +#define SSL2_CK_DES_64_CBC_WITH_MD5 0x02060040 +#define SSL2_CK_DES_64_CBC_WITH_SHA 0x02060140 /* v3 */ +#define SSL2_CK_DES_192_EDE3_CBC_WITH_MD5 0x020700c0 +#define SSL2_CK_DES_192_EDE3_CBC_WITH_SHA 0x020701c0 /* v3 */ +#define SSL2_CK_RC4_64_WITH_MD5 0x02080080 /* MS hack */ + +#define SSL2_CK_DES_64_CFB64_WITH_MD5_1 0x02ff0800 /* SSLeay */ +#define SSL2_CK_NULL 0x02ff0810 /* SSLeay */ + +#define SSL2_TXT_DES_64_CFB64_WITH_MD5_1 "DES-CFB-M1" +#define SSL2_TXT_NULL_WITH_MD5 "NULL-MD5" +#define SSL2_TXT_RC4_128_WITH_MD5 "RC4-MD5" +#define SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 "EXP-RC4-MD5" +#define SSL2_TXT_RC2_128_CBC_WITH_MD5 "RC2-CBC-MD5" +#define SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 "EXP-RC2-CBC-MD5" +#define SSL2_TXT_IDEA_128_CBC_WITH_MD5 "IDEA-CBC-MD5" +#define SSL2_TXT_DES_64_CBC_WITH_MD5 "DES-CBC-MD5" +#define SSL2_TXT_DES_64_CBC_WITH_SHA "DES-CBC-SHA" +#define SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 "DES-CBC3-MD5" +#define SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA "DES-CBC3-SHA" +#define SSL2_TXT_RC4_64_WITH_MD5 "RC4-64-MD5" + +#define SSL2_TXT_NULL "NULL" + +/* Flags for the SSL_CIPHER.algorithm2 field */ +#define SSL2_CF_5_BYTE_ENC 0x01 +#define SSL2_CF_8_BYTE_ENC 0x02 + +/* Certificate Type Codes */ +#define SSL2_CT_X509_CERTIFICATE 0x01 + +/* Authentication Type Code */ +#define SSL2_AT_MD5_WITH_RSA_ENCRYPTION 0x01 + +#define SSL2_MAX_SSL_SESSION_ID_LENGTH 32 + +/* Upper/Lower Bounds */ +#define SSL2_MAX_MASTER_KEY_LENGTH_IN_BITS 256 +#ifdef OPENSSL_SYS_MPE +#define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 29998u +#else +#define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 32767u /* 2^15-1 */ +#endif +#define SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER 16383 /* 2^14-1 */ + +#define SSL2_CHALLENGE_LENGTH 16 +/*#define SSL2_CHALLENGE_LENGTH 32 */ +#define SSL2_MIN_CHALLENGE_LENGTH 16 +#define SSL2_MAX_CHALLENGE_LENGTH 32 +#define SSL2_CONNECTION_ID_LENGTH 16 +#define SSL2_MAX_CONNECTION_ID_LENGTH 16 +#define SSL2_SSL_SESSION_ID_LENGTH 16 +#define SSL2_MAX_CERT_CHALLENGE_LENGTH 32 +#define SSL2_MIN_CERT_CHALLENGE_LENGTH 16 +#define SSL2_MAX_KEY_MATERIAL_LENGTH 24 + +#ifndef HEADER_SSL_LOCL_H +#define CERT char +#endif + +typedef struct ssl2_state_st + { + int three_byte_header; + int clear_text; /* clear text */ + int escape; /* not used in SSLv2 */ + int ssl2_rollback; /* used if SSLv23 rolled back to SSLv2 */ + + /* non-blocking io info, used to make sure the same + * args were passwd */ + unsigned int wnum; /* number of bytes sent so far */ + int wpend_tot; + const unsigned char *wpend_buf; + + int wpend_off; /* offset to data to write */ + int wpend_len; /* number of bytes passwd to write */ + int wpend_ret; /* number of bytes to return to caller */ + + /* buffer raw data */ + int rbuf_left; + int rbuf_offs; + unsigned char *rbuf; + unsigned char *wbuf; + + unsigned char *write_ptr;/* used to point to the start due to + * 2/3 byte header. */ + + unsigned int padding; + unsigned int rlength; /* passed to ssl2_enc */ + int ract_data_length; /* Set when things are encrypted. */ + unsigned int wlength; /* passed to ssl2_enc */ + int wact_data_length; /* Set when things are decrypted. */ + unsigned char *ract_data; + unsigned char *wact_data; + unsigned char *mac_data; + + unsigned char *read_key; + unsigned char *write_key; + + /* Stuff specifically to do with this SSL session */ + unsigned int challenge_length; + unsigned char challenge[SSL2_MAX_CHALLENGE_LENGTH]; + unsigned int conn_id_length; + unsigned char conn_id[SSL2_MAX_CONNECTION_ID_LENGTH]; + unsigned int key_material_length; + unsigned char key_material[SSL2_MAX_KEY_MATERIAL_LENGTH*2]; + + unsigned long read_sequence; + unsigned long write_sequence; + + struct { + unsigned int conn_id_length; + unsigned int cert_type; + unsigned int cert_length; + unsigned int csl; + unsigned int clear; + unsigned int enc; + unsigned char ccl[SSL2_MAX_CERT_CHALLENGE_LENGTH]; + unsigned int cipher_spec_length; + unsigned int session_id_length; + unsigned int clen; + unsigned int rlen; + } tmp; + } SSL2_STATE; + +/* SSLv2 */ +/* client */ +#define SSL2_ST_SEND_CLIENT_HELLO_A (0x10|SSL_ST_CONNECT) +#define SSL2_ST_SEND_CLIENT_HELLO_B (0x11|SSL_ST_CONNECT) +#define SSL2_ST_GET_SERVER_HELLO_A (0x20|SSL_ST_CONNECT) +#define SSL2_ST_GET_SERVER_HELLO_B (0x21|SSL_ST_CONNECT) +#define SSL2_ST_SEND_CLIENT_MASTER_KEY_A (0x30|SSL_ST_CONNECT) +#define SSL2_ST_SEND_CLIENT_MASTER_KEY_B (0x31|SSL_ST_CONNECT) +#define SSL2_ST_SEND_CLIENT_FINISHED_A (0x40|SSL_ST_CONNECT) +#define SSL2_ST_SEND_CLIENT_FINISHED_B (0x41|SSL_ST_CONNECT) +#define SSL2_ST_SEND_CLIENT_CERTIFICATE_A (0x50|SSL_ST_CONNECT) +#define SSL2_ST_SEND_CLIENT_CERTIFICATE_B (0x51|SSL_ST_CONNECT) +#define SSL2_ST_SEND_CLIENT_CERTIFICATE_C (0x52|SSL_ST_CONNECT) +#define SSL2_ST_SEND_CLIENT_CERTIFICATE_D (0x53|SSL_ST_CONNECT) +#define SSL2_ST_GET_SERVER_VERIFY_A (0x60|SSL_ST_CONNECT) +#define SSL2_ST_GET_SERVER_VERIFY_B (0x61|SSL_ST_CONNECT) +#define SSL2_ST_GET_SERVER_FINISHED_A (0x70|SSL_ST_CONNECT) +#define SSL2_ST_GET_SERVER_FINISHED_B (0x71|SSL_ST_CONNECT) +#define SSL2_ST_CLIENT_START_ENCRYPTION (0x80|SSL_ST_CONNECT) +#define SSL2_ST_X509_GET_CLIENT_CERTIFICATE (0x90|SSL_ST_CONNECT) +/* server */ +#define SSL2_ST_GET_CLIENT_HELLO_A (0x10|SSL_ST_ACCEPT) +#define SSL2_ST_GET_CLIENT_HELLO_B (0x11|SSL_ST_ACCEPT) +#define SSL2_ST_GET_CLIENT_HELLO_C (0x12|SSL_ST_ACCEPT) +#define SSL2_ST_SEND_SERVER_HELLO_A (0x20|SSL_ST_ACCEPT) +#define SSL2_ST_SEND_SERVER_HELLO_B (0x21|SSL_ST_ACCEPT) +#define SSL2_ST_GET_CLIENT_MASTER_KEY_A (0x30|SSL_ST_ACCEPT) +#define SSL2_ST_GET_CLIENT_MASTER_KEY_B (0x31|SSL_ST_ACCEPT) +#define SSL2_ST_SEND_SERVER_VERIFY_A (0x40|SSL_ST_ACCEPT) +#define SSL2_ST_SEND_SERVER_VERIFY_B (0x41|SSL_ST_ACCEPT) +#define SSL2_ST_SEND_SERVER_VERIFY_C (0x42|SSL_ST_ACCEPT) +#define SSL2_ST_GET_CLIENT_FINISHED_A (0x50|SSL_ST_ACCEPT) +#define SSL2_ST_GET_CLIENT_FINISHED_B (0x51|SSL_ST_ACCEPT) +#define SSL2_ST_SEND_SERVER_FINISHED_A (0x60|SSL_ST_ACCEPT) +#define SSL2_ST_SEND_SERVER_FINISHED_B (0x61|SSL_ST_ACCEPT) +#define SSL2_ST_SEND_REQUEST_CERTIFICATE_A (0x70|SSL_ST_ACCEPT) +#define SSL2_ST_SEND_REQUEST_CERTIFICATE_B (0x71|SSL_ST_ACCEPT) +#define SSL2_ST_SEND_REQUEST_CERTIFICATE_C (0x72|SSL_ST_ACCEPT) +#define SSL2_ST_SEND_REQUEST_CERTIFICATE_D (0x73|SSL_ST_ACCEPT) +#define SSL2_ST_SERVER_START_ENCRYPTION (0x80|SSL_ST_ACCEPT) +#define SSL2_ST_X509_GET_SERVER_CERTIFICATE (0x90|SSL_ST_ACCEPT) + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/mswin32/OpenSSL/include/openssl/ssl23.h b/mswin32/OpenSSL/include/openssl/ssl23.h new file mode 100755 index 000000000..d3228983c --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ssl23.h @@ -0,0 +1,83 @@ +/* ssl/ssl23.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.] + */ + +#ifndef HEADER_SSL23_H +#define HEADER_SSL23_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*client */ +/* write to server */ +#define SSL23_ST_CW_CLNT_HELLO_A (0x210|SSL_ST_CONNECT) +#define SSL23_ST_CW_CLNT_HELLO_B (0x211|SSL_ST_CONNECT) +/* read from server */ +#define SSL23_ST_CR_SRVR_HELLO_A (0x220|SSL_ST_CONNECT) +#define SSL23_ST_CR_SRVR_HELLO_B (0x221|SSL_ST_CONNECT) + +/* server */ +/* read from client */ +#define SSL23_ST_SR_CLNT_HELLO_A (0x210|SSL_ST_ACCEPT) +#define SSL23_ST_SR_CLNT_HELLO_B (0x211|SSL_ST_ACCEPT) + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/mswin32/OpenSSL/include/openssl/ssl3.h b/mswin32/OpenSSL/include/openssl/ssl3.h new file mode 100755 index 000000000..f484df3f6 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ssl3.h @@ -0,0 +1,560 @@ +/* ssl/ssl3.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.] + */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_SSL3_H +#define HEADER_SSL3_H + +#ifndef OPENSSL_NO_COMP +#include +#endif +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define SSL3_CK_RSA_NULL_MD5 0x03000001 +#define SSL3_CK_RSA_NULL_SHA 0x03000002 +#define SSL3_CK_RSA_RC4_40_MD5 0x03000003 +#define SSL3_CK_RSA_RC4_128_MD5 0x03000004 +#define SSL3_CK_RSA_RC4_128_SHA 0x03000005 +#define SSL3_CK_RSA_RC2_40_MD5 0x03000006 +#define SSL3_CK_RSA_IDEA_128_SHA 0x03000007 +#define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008 +#define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009 +#define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A + +#define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B +#define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C +#define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D +#define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E +#define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F +#define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010 + +#define SSL3_CK_EDH_DSS_DES_40_CBC_SHA 0x03000011 +#define SSL3_CK_EDH_DSS_DES_64_CBC_SHA 0x03000012 +#define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA 0x03000013 +#define SSL3_CK_EDH_RSA_DES_40_CBC_SHA 0x03000014 +#define SSL3_CK_EDH_RSA_DES_64_CBC_SHA 0x03000015 +#define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA 0x03000016 + +#define SSL3_CK_ADH_RC4_40_MD5 0x03000017 +#define SSL3_CK_ADH_RC4_128_MD5 0x03000018 +#define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019 +#define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A +#define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B + +#define SSL3_CK_FZA_DMS_NULL_SHA 0x0300001C +#define SSL3_CK_FZA_DMS_FZA_SHA 0x0300001D +#if 0 /* Because it clashes with KRB5, is never used any more, and is safe + to remove according to David Hopwood + of the ietf-tls list */ +#define SSL3_CK_FZA_DMS_RC4_SHA 0x0300001E +#endif + +/* VRS Additional Kerberos5 entries + */ +#define SSL3_CK_KRB5_DES_64_CBC_SHA 0x0300001E +#define SSL3_CK_KRB5_DES_192_CBC3_SHA 0x0300001F +#define SSL3_CK_KRB5_RC4_128_SHA 0x03000020 +#define SSL3_CK_KRB5_IDEA_128_CBC_SHA 0x03000021 +#define SSL3_CK_KRB5_DES_64_CBC_MD5 0x03000022 +#define SSL3_CK_KRB5_DES_192_CBC3_MD5 0x03000023 +#define SSL3_CK_KRB5_RC4_128_MD5 0x03000024 +#define SSL3_CK_KRB5_IDEA_128_CBC_MD5 0x03000025 + +#define SSL3_CK_KRB5_DES_40_CBC_SHA 0x03000026 +#define SSL3_CK_KRB5_RC2_40_CBC_SHA 0x03000027 +#define SSL3_CK_KRB5_RC4_40_SHA 0x03000028 +#define SSL3_CK_KRB5_DES_40_CBC_MD5 0x03000029 +#define SSL3_CK_KRB5_RC2_40_CBC_MD5 0x0300002A +#define SSL3_CK_KRB5_RC4_40_MD5 0x0300002B + +#define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5" +#define SSL3_TXT_RSA_NULL_SHA "NULL-SHA" +#define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5" +#define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5" +#define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA" +#define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5" +#define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA" +#define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA" +#define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA" +#define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA" + +#define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA" +#define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA" +#define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA" +#define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA" +#define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA" +#define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA" + +#define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA" +#define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA" +#define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA" +#define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA" +#define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA" +#define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA" + +#define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5" +#define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5" +#define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA" +#define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA" +#define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA" + +#define SSL3_TXT_FZA_DMS_NULL_SHA "FZA-NULL-SHA" +#define SSL3_TXT_FZA_DMS_FZA_SHA "FZA-FZA-CBC-SHA" +#define SSL3_TXT_FZA_DMS_RC4_SHA "FZA-RC4-SHA" + +#define SSL3_TXT_KRB5_DES_64_CBC_SHA "KRB5-DES-CBC-SHA" +#define SSL3_TXT_KRB5_DES_192_CBC3_SHA "KRB5-DES-CBC3-SHA" +#define SSL3_TXT_KRB5_RC4_128_SHA "KRB5-RC4-SHA" +#define SSL3_TXT_KRB5_IDEA_128_CBC_SHA "KRB5-IDEA-CBC-SHA" +#define SSL3_TXT_KRB5_DES_64_CBC_MD5 "KRB5-DES-CBC-MD5" +#define SSL3_TXT_KRB5_DES_192_CBC3_MD5 "KRB5-DES-CBC3-MD5" +#define SSL3_TXT_KRB5_RC4_128_MD5 "KRB5-RC4-MD5" +#define SSL3_TXT_KRB5_IDEA_128_CBC_MD5 "KRB5-IDEA-CBC-MD5" + +#define SSL3_TXT_KRB5_DES_40_CBC_SHA "EXP-KRB5-DES-CBC-SHA" +#define SSL3_TXT_KRB5_RC2_40_CBC_SHA "EXP-KRB5-RC2-CBC-SHA" +#define SSL3_TXT_KRB5_RC4_40_SHA "EXP-KRB5-RC4-SHA" +#define SSL3_TXT_KRB5_DES_40_CBC_MD5 "EXP-KRB5-DES-CBC-MD5" +#define SSL3_TXT_KRB5_RC2_40_CBC_MD5 "EXP-KRB5-RC2-CBC-MD5" +#define SSL3_TXT_KRB5_RC4_40_MD5 "EXP-KRB5-RC4-MD5" + +#define SSL3_SSL_SESSION_ID_LENGTH 32 +#define SSL3_MAX_SSL_SESSION_ID_LENGTH 32 + +#define SSL3_MASTER_SECRET_SIZE 48 +#define SSL3_RANDOM_SIZE 32 +#define SSL3_SESSION_ID_SIZE 32 +#define SSL3_RT_HEADER_LENGTH 5 + +/* Due to MS stuffing up, this can change.... */ +#if defined(OPENSSL_SYS_WIN16) || \ + (defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32)) +#define SSL3_RT_MAX_EXTRA (14000) +#else +#define SSL3_RT_MAX_EXTRA (16384) +#endif + +#define SSL3_RT_MAX_PLAIN_LENGTH 16384 +#ifdef OPENSSL_NO_COMP +#define SSL3_RT_MAX_COMPRESSED_LENGTH SSL3_RT_MAX_PLAIN_LENGTH +#else +#define SSL3_RT_MAX_COMPRESSED_LENGTH (1024+SSL3_RT_MAX_PLAIN_LENGTH) +#endif +#define SSL3_RT_MAX_ENCRYPTED_LENGTH (1024+SSL3_RT_MAX_COMPRESSED_LENGTH) +#define SSL3_RT_MAX_PACKET_SIZE (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH) +#define SSL3_RT_MAX_DATA_SIZE (1024*1024) + +#define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54" +#define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52" + +#define SSL3_VERSION 0x0300 +#define SSL3_VERSION_MAJOR 0x03 +#define SSL3_VERSION_MINOR 0x00 + +#define SSL3_RT_CHANGE_CIPHER_SPEC 20 +#define SSL3_RT_ALERT 21 +#define SSL3_RT_HANDSHAKE 22 +#define SSL3_RT_APPLICATION_DATA 23 + +#define SSL3_AL_WARNING 1 +#define SSL3_AL_FATAL 2 + +#define SSL3_AD_CLOSE_NOTIFY 0 +#define SSL3_AD_UNEXPECTED_MESSAGE 10 /* fatal */ +#define SSL3_AD_BAD_RECORD_MAC 20 /* fatal */ +#define SSL3_AD_DECOMPRESSION_FAILURE 30 /* fatal */ +#define SSL3_AD_HANDSHAKE_FAILURE 40 /* fatal */ +#define SSL3_AD_NO_CERTIFICATE 41 +#define SSL3_AD_BAD_CERTIFICATE 42 +#define SSL3_AD_UNSUPPORTED_CERTIFICATE 43 +#define SSL3_AD_CERTIFICATE_REVOKED 44 +#define SSL3_AD_CERTIFICATE_EXPIRED 45 +#define SSL3_AD_CERTIFICATE_UNKNOWN 46 +#define SSL3_AD_ILLEGAL_PARAMETER 47 /* fatal */ + +typedef struct ssl3_record_st + { +/*r */ int type; /* type of record */ +/*rw*/ unsigned int length; /* How many bytes available */ +/*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 */ +/*r */ unsigned char *comp; /* only used with decompression - malloc()ed */ +/*r */ unsigned long epoch; /* epoch number, needed by DTLS1 */ +/*r */ PQ_64BIT seq_num; /* sequence number, needed by DTLS1 */ + } SSL3_RECORD; + +typedef struct ssl3_buffer_st + { + unsigned char *buf; /* at least SSL3_RT_MAX_PACKET_SIZE bytes, + * see ssl3_setup_buffers() */ + size_t len; /* buffer size */ + int offset; /* where to 'copy from' */ + int left; /* how many bytes left */ + } SSL3_BUFFER; + +#define SSL3_CT_RSA_SIGN 1 +#define SSL3_CT_DSS_SIGN 2 +#define SSL3_CT_RSA_FIXED_DH 3 +#define SSL3_CT_DSS_FIXED_DH 4 +#define SSL3_CT_RSA_EPHEMERAL_DH 5 +#define SSL3_CT_DSS_EPHEMERAL_DH 6 +#define SSL3_CT_FORTEZZA_DMS 20 +/* SSL3_CT_NUMBER is used to size arrays and it must be large + * enough to contain all of the cert types defined either for + * SSLv3 and TLSv1. + */ +#define SSL3_CT_NUMBER 7 + + +#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 + +typedef struct ssl3_state_st + { + long flags; + int delay_buf_pop_ret; + + unsigned char read_sequence[8]; + unsigned char read_mac_secret[EVP_MAX_MD_SIZE]; + unsigned char write_sequence[8]; + unsigned char write_mac_secret[EVP_MAX_MD_SIZE]; + + unsigned char server_random[SSL3_RANDOM_SIZE]; + unsigned char client_random[SSL3_RANDOM_SIZE]; + + /* flags for countermeasure against known-IV weakness */ + int need_empty_fragments; + int empty_fragment_done; + + SSL3_BUFFER rbuf; /* read IO goes into here */ + SSL3_BUFFER wbuf; /* write IO goes into here */ + + SSL3_RECORD rrec; /* each decoded record goes in here */ + SSL3_RECORD wrec; /* goes out from here */ + + /* storage for Alert/Handshake protocol data received but not + * yet processed by ssl3_read_bytes: */ + unsigned char alert_fragment[2]; + unsigned int alert_fragment_len; + unsigned char handshake_fragment[4]; + unsigned int handshake_fragment_len; + + /* partial write - check the numbers match */ + unsigned int wnum; /* number of bytes sent so far */ + int wpend_tot; /* number bytes written */ + int wpend_type; + int wpend_ret; /* number of bytes submitted */ + const unsigned char *wpend_buf; + + /* used during startup, digest all incoming/outgoing packets */ + EVP_MD_CTX finish_dgst1; + EVP_MD_CTX finish_dgst2; + + /* this is set whenerver we see a change_cipher_spec message + * come in when we are not looking for one */ + int change_cipher_spec; + + int warn_alert; + int fatal_alert; + /* we allow one fatal and one warning alert to be outstanding, + * send close alert via the warning alert */ + int alert_dispatch; + unsigned char send_alert[2]; + + /* This flag is set when we should renegotiate ASAP, basically when + * there is no more data in the read or write buffers */ + int renegotiate; + int total_renegotiations; + int num_renegotiations; + + int in_read_app_data; + + struct { + /* actually only needs to be 16+20 */ + unsigned char cert_verify_md[EVP_MAX_MD_SIZE*2]; + + /* actually only need to be 16+20 for SSLv3 and 12 for TLS */ + unsigned char finish_md[EVP_MAX_MD_SIZE*2]; + int finish_md_len; + unsigned char peer_finish_md[EVP_MAX_MD_SIZE*2]; + int peer_finish_md_len; + + unsigned long message_size; + int message_type; + + /* used to hold the new cipher we are going to use */ + SSL_CIPHER *new_cipher; +#ifndef OPENSSL_NO_DH + DH *dh; +#endif + +#ifndef OPENSSL_NO_ECDH + EC_KEY *ecdh; /* holds short lived ECDH key */ +#endif + + /* used when SSL_ST_FLUSH_DATA is entered */ + int next_state; + + int reuse_message; + + /* used for certificate requests */ + int cert_req; + int ctype_num; + char ctype[SSL3_CT_NUMBER]; + STACK_OF(X509_NAME) *ca_names; + + int use_rsa_tmp; + + int key_block_length; + unsigned char *key_block; + + const EVP_CIPHER *new_sym_enc; + const EVP_MD *new_hash; +#ifndef OPENSSL_NO_COMP + const SSL_COMP *new_compression; +#else + char *new_compression; +#endif + int cert_request; + } tmp; + + } SSL3_STATE; + + +/* SSLv3 */ +/*client */ +/* extra state */ +#define SSL3_ST_CW_FLUSH (0x100|SSL_ST_CONNECT) +/* write to server */ +#define SSL3_ST_CW_CLNT_HELLO_A (0x110|SSL_ST_CONNECT) +#define SSL3_ST_CW_CLNT_HELLO_B (0x111|SSL_ST_CONNECT) +/* read from server */ +#define SSL3_ST_CR_SRVR_HELLO_A (0x120|SSL_ST_CONNECT) +#define SSL3_ST_CR_SRVR_HELLO_B (0x121|SSL_ST_CONNECT) +#define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A (0x126|SSL_ST_CONNECT) +#define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B (0x127|SSL_ST_CONNECT) +#define SSL3_ST_CR_CERT_A (0x130|SSL_ST_CONNECT) +#define SSL3_ST_CR_CERT_B (0x131|SSL_ST_CONNECT) +#define SSL3_ST_CR_KEY_EXCH_A (0x140|SSL_ST_CONNECT) +#define SSL3_ST_CR_KEY_EXCH_B (0x141|SSL_ST_CONNECT) +#define SSL3_ST_CR_CERT_REQ_A (0x150|SSL_ST_CONNECT) +#define SSL3_ST_CR_CERT_REQ_B (0x151|SSL_ST_CONNECT) +#define SSL3_ST_CR_SRVR_DONE_A (0x160|SSL_ST_CONNECT) +#define SSL3_ST_CR_SRVR_DONE_B (0x161|SSL_ST_CONNECT) +/* write to server */ +#define SSL3_ST_CW_CERT_A (0x170|SSL_ST_CONNECT) +#define SSL3_ST_CW_CERT_B (0x171|SSL_ST_CONNECT) +#define SSL3_ST_CW_CERT_C (0x172|SSL_ST_CONNECT) +#define SSL3_ST_CW_CERT_D (0x173|SSL_ST_CONNECT) +#define SSL3_ST_CW_KEY_EXCH_A (0x180|SSL_ST_CONNECT) +#define SSL3_ST_CW_KEY_EXCH_B (0x181|SSL_ST_CONNECT) +#define SSL3_ST_CW_CERT_VRFY_A (0x190|SSL_ST_CONNECT) +#define SSL3_ST_CW_CERT_VRFY_B (0x191|SSL_ST_CONNECT) +#define SSL3_ST_CW_CHANGE_A (0x1A0|SSL_ST_CONNECT) +#define SSL3_ST_CW_CHANGE_B (0x1A1|SSL_ST_CONNECT) +#define SSL3_ST_CW_FINISHED_A (0x1B0|SSL_ST_CONNECT) +#define SSL3_ST_CW_FINISHED_B (0x1B1|SSL_ST_CONNECT) +/* read from server */ +#define SSL3_ST_CR_CHANGE_A (0x1C0|SSL_ST_CONNECT) +#define SSL3_ST_CR_CHANGE_B (0x1C1|SSL_ST_CONNECT) +#define SSL3_ST_CR_FINISHED_A (0x1D0|SSL_ST_CONNECT) +#define SSL3_ST_CR_FINISHED_B (0x1D1|SSL_ST_CONNECT) +#define SSL3_ST_CR_SESSION_TICKET_A (0x1E0|SSL_ST_CONNECT) +#define SSL3_ST_CR_SESSION_TICKET_B (0x1E1|SSL_ST_CONNECT) + +/* server */ +/* extra state */ +#define SSL3_ST_SW_FLUSH (0x100|SSL_ST_ACCEPT) +/* read from client */ +/* Do not change the number values, they do matter */ +#define SSL3_ST_SR_CLNT_HELLO_A (0x110|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CLNT_HELLO_B (0x111|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CLNT_HELLO_C (0x112|SSL_ST_ACCEPT) +/* write to client */ +#define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A (0x113|SSL_ST_ACCEPT) +#define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B (0x114|SSL_ST_ACCEPT) +#define SSL3_ST_SW_HELLO_REQ_A (0x120|SSL_ST_ACCEPT) +#define SSL3_ST_SW_HELLO_REQ_B (0x121|SSL_ST_ACCEPT) +#define SSL3_ST_SW_HELLO_REQ_C (0x122|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SRVR_HELLO_A (0x130|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SRVR_HELLO_B (0x131|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CERT_A (0x140|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CERT_B (0x141|SSL_ST_ACCEPT) +#define SSL3_ST_SW_KEY_EXCH_A (0x150|SSL_ST_ACCEPT) +#define SSL3_ST_SW_KEY_EXCH_B (0x151|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CERT_REQ_A (0x160|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CERT_REQ_B (0x161|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SRVR_DONE_A (0x170|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SRVR_DONE_B (0x171|SSL_ST_ACCEPT) +/* read from client */ +#define SSL3_ST_SR_CERT_A (0x180|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CERT_B (0x181|SSL_ST_ACCEPT) +#define SSL3_ST_SR_KEY_EXCH_A (0x190|SSL_ST_ACCEPT) +#define SSL3_ST_SR_KEY_EXCH_B (0x191|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CERT_VRFY_A (0x1A0|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CERT_VRFY_B (0x1A1|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CHANGE_A (0x1B0|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CHANGE_B (0x1B1|SSL_ST_ACCEPT) +#define SSL3_ST_SR_FINISHED_A (0x1C0|SSL_ST_ACCEPT) +#define SSL3_ST_SR_FINISHED_B (0x1C1|SSL_ST_ACCEPT) +/* write to client */ +#define SSL3_ST_SW_CHANGE_A (0x1D0|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CHANGE_B (0x1D1|SSL_ST_ACCEPT) +#define SSL3_ST_SW_FINISHED_A (0x1E0|SSL_ST_ACCEPT) +#define SSL3_ST_SW_FINISHED_B (0x1E1|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SESSION_TICKET_A (0x1F0|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SESSION_TICKET_B (0x1F1|SSL_ST_ACCEPT) + +#define SSL3_MT_HELLO_REQUEST 0 +#define SSL3_MT_CLIENT_HELLO 1 +#define SSL3_MT_SERVER_HELLO 2 +#define SSL3_MT_NEWSESSION_TICKET 4 +#define SSL3_MT_CERTIFICATE 11 +#define SSL3_MT_SERVER_KEY_EXCHANGE 12 +#define SSL3_MT_CERTIFICATE_REQUEST 13 +#define SSL3_MT_SERVER_DONE 14 +#define SSL3_MT_CERTIFICATE_VERIFY 15 +#define SSL3_MT_CLIENT_KEY_EXCHANGE 16 +#define SSL3_MT_FINISHED 20 +#define DTLS1_MT_HELLO_VERIFY_REQUEST 3 + + +#define SSL3_MT_CCS 1 + +/* These are used when changing over to a new cipher */ +#define SSL3_CC_READ 0x01 +#define SSL3_CC_WRITE 0x02 +#define SSL3_CC_CLIENT 0x10 +#define SSL3_CC_SERVER 0x20 +#define SSL3_CHANGE_CIPHER_CLIENT_WRITE (SSL3_CC_CLIENT|SSL3_CC_WRITE) +#define SSL3_CHANGE_CIPHER_SERVER_READ (SSL3_CC_SERVER|SSL3_CC_READ) +#define SSL3_CHANGE_CIPHER_CLIENT_READ (SSL3_CC_CLIENT|SSL3_CC_READ) +#define SSL3_CHANGE_CIPHER_SERVER_WRITE (SSL3_CC_SERVER|SSL3_CC_WRITE) + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/mswin32/OpenSSL/include/openssl/stack.h b/mswin32/OpenSSL/include/openssl/stack.h new file mode 100755 index 000000000..5cbb116a8 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/stack.h @@ -0,0 +1,109 @@ +/* crypto/stack/stack.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.] + */ + +#ifndef HEADER_STACK_H +#define HEADER_STACK_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct stack_st + { + int num; + char **data; + int sorted; + + int num_alloc; + int (*comp)(const char * const *, const char * const *); + } STACK; + +#define M_sk_num(sk) ((sk) ? (sk)->num:-1) +#define M_sk_value(sk,n) ((sk) ? (sk)->data[n] : NULL) + +int sk_num(const STACK *); +char *sk_value(const STACK *, int); + +char *sk_set(STACK *, int, char *); + +STACK *sk_new(int (*cmp)(const char * const *, const char * const *)); +STACK *sk_new_null(void); +void sk_free(STACK *); +void sk_pop_free(STACK *st, void (*func)(void *)); +int sk_insert(STACK *sk,char *data,int where); +char *sk_delete(STACK *st,int loc); +char *sk_delete_ptr(STACK *st, char *p); +int sk_find(STACK *st,char *data); +int sk_find_ex(STACK *st,char *data); +int sk_push(STACK *st,char *data); +int sk_unshift(STACK *st,char *data); +char *sk_shift(STACK *st); +char *sk_pop(STACK *st); +void sk_zero(STACK *st); +int (*sk_set_cmp_func(STACK *sk, int (*c)(const char * const *, + const char * const *))) + (const char * const *, const char * const *); +STACK *sk_dup(STACK *st); +void sk_sort(STACK *st); +int sk_is_sorted(const STACK *st); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/store.h b/mswin32/OpenSSL/include/openssl/store.h new file mode 100755 index 000000000..64583377a --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/store.h @@ -0,0 +1,554 @@ +/* crypto/store/store.h -*- mode:C; c-file-style: "eay" -*- */ +/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL + * project 2003. + */ +/* ==================================================================== + * Copyright (c) 2003 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_STORE_H +#define HEADER_STORE_H + +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#include +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct store_st STORE; */ +/* typedef struct store_method_st STORE_METHOD; */ + + +/* All the following functions return 0, a negative number or NULL on error. + When everything is fine, they return a positive value or a non-NULL + pointer, all depending on their purpose. */ + +/* Creators and destructor. */ +STORE *STORE_new_method(const STORE_METHOD *method); +STORE *STORE_new_engine(ENGINE *engine); +void STORE_free(STORE *ui); + + +/* Give a user interface parametrised control commands. This can be used to + send down an integer, a data pointer or a function pointer, as well as + be used to get information from a STORE. */ +int STORE_ctrl(STORE *store, int cmd, long i, void *p, void (*f)(void)); + +/* A control to set the directory with keys and certificates. Used by the + built-in directory level method. */ +#define STORE_CTRL_SET_DIRECTORY 0x0001 +/* A control to set a file to load. Used by the built-in file level method. */ +#define STORE_CTRL_SET_FILE 0x0002 +/* A control to set a configuration file to load. Can be used by any method + that wishes to load a configuration file. */ +#define STORE_CTRL_SET_CONF_FILE 0x0003 +/* A control to set a the section of the loaded configuration file. Can be + used by any method that wishes to load a configuration file. */ +#define STORE_CTRL_SET_CONF_SECTION 0x0004 + + +/* Some methods may use extra data */ +#define STORE_set_app_data(s,arg) STORE_set_ex_data(s,0,arg) +#define STORE_get_app_data(s) STORE_get_ex_data(s,0) +int STORE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int STORE_set_ex_data(STORE *r,int idx,void *arg); +void *STORE_get_ex_data(STORE *r, int idx); + +/* Use specific methods instead of the built-in one */ +const STORE_METHOD *STORE_get_method(STORE *store); +const STORE_METHOD *STORE_set_method(STORE *store, const STORE_METHOD *meth); + +/* The standard OpenSSL methods. */ +/* This is the in-memory method. It does everything except revoking and updating, + and is of course volatile. It's used by other methods that have an in-memory + cache. */ +const STORE_METHOD *STORE_Memory(void); +#if 0 /* Not yet implemented */ +/* This is the directory store. It does everything except revoking and updating, + and uses STORE_Memory() to cache things in memory. */ +const STORE_METHOD *STORE_Directory(void); +/* This is the file store. It does everything except revoking and updating, + and uses STORE_Memory() to cache things in memory. Certificates are added + to it with the store operation, and it will only get cached certificates. */ +const STORE_METHOD *STORE_File(void); +#endif + +/* Store functions take a type code for the type of data they should store + or fetch */ +typedef enum STORE_object_types + { + STORE_OBJECT_TYPE_X509_CERTIFICATE= 0x01, /* X509 * */ + STORE_OBJECT_TYPE_X509_CRL= 0x02, /* X509_CRL * */ + STORE_OBJECT_TYPE_PRIVATE_KEY= 0x03, /* EVP_PKEY * */ + STORE_OBJECT_TYPE_PUBLIC_KEY= 0x04, /* EVP_PKEY * */ + STORE_OBJECT_TYPE_NUMBER= 0x05, /* BIGNUM * */ + STORE_OBJECT_TYPE_ARBITRARY= 0x06, /* BUF_MEM * */ + STORE_OBJECT_TYPE_NUM= 0x06 /* The amount of known + object types */ + } STORE_OBJECT_TYPES; +/* List of text strings corresponding to the object types. */ +extern const char * const STORE_object_type_string[STORE_OBJECT_TYPE_NUM+1]; + +/* Some store functions take a parameter list. Those parameters come with + one of the following codes. The comments following the codes below indicate + what type the value should be a pointer to. */ +typedef enum STORE_params + { + STORE_PARAM_EVP_TYPE= 0x01, /* int */ + STORE_PARAM_BITS= 0x02, /* size_t */ + STORE_PARAM_KEY_PARAMETERS= 0x03, /* ??? */ + STORE_PARAM_KEY_NO_PARAMETERS= 0x04, /* N/A */ + STORE_PARAM_AUTH_PASSPHRASE= 0x05, /* char * */ + STORE_PARAM_AUTH_KRB5_TICKET= 0x06, /* void * */ + STORE_PARAM_TYPE_NUM= 0x06 /* The amount of known + parameter types */ + } STORE_PARAM_TYPES; +/* Parameter value sizes. -1 means unknown, anything else is the required size. */ +extern const int STORE_param_sizes[STORE_PARAM_TYPE_NUM+1]; + +/* Store functions take attribute lists. Those attributes come with codes. + The comments following the codes below indicate what type the value should + be a pointer to. */ +typedef enum STORE_attribs + { + STORE_ATTR_END= 0x00, + STORE_ATTR_FRIENDLYNAME= 0x01, /* C string */ + STORE_ATTR_KEYID= 0x02, /* 160 bit string (SHA1) */ + STORE_ATTR_ISSUERKEYID= 0x03, /* 160 bit string (SHA1) */ + STORE_ATTR_SUBJECTKEYID= 0x04, /* 160 bit string (SHA1) */ + STORE_ATTR_ISSUERSERIALHASH= 0x05, /* 160 bit string (SHA1) */ + STORE_ATTR_ISSUER= 0x06, /* X509_NAME * */ + STORE_ATTR_SERIAL= 0x07, /* BIGNUM * */ + STORE_ATTR_SUBJECT= 0x08, /* X509_NAME * */ + STORE_ATTR_CERTHASH= 0x09, /* 160 bit string (SHA1) */ + STORE_ATTR_EMAIL= 0x0a, /* C string */ + STORE_ATTR_FILENAME= 0x0b, /* C string */ + STORE_ATTR_TYPE_NUM= 0x0b, /* The amount of known + attribute types */ + STORE_ATTR_OR= 0xff /* This is a special + separator, which + expresses the OR + operation. */ + } STORE_ATTR_TYPES; +/* Attribute value sizes. -1 means unknown, anything else is the required size. */ +extern const int STORE_attr_sizes[STORE_ATTR_TYPE_NUM+1]; + +typedef enum STORE_certificate_status + { + STORE_X509_VALID= 0x00, + STORE_X509_EXPIRED= 0x01, + STORE_X509_SUSPENDED= 0x02, + STORE_X509_REVOKED= 0x03 + } STORE_CERTIFICATE_STATUS; + +/* Engine store functions will return a structure that contains all the necessary + * information, including revokation status for certificates. This is really not + * needed for application authors, as the ENGINE framework functions will extract + * the OpenSSL-specific information when at all possible. However, for engine + * authors, it's crucial to know this structure. */ +typedef struct STORE_OBJECT_st + { + STORE_OBJECT_TYPES type; + union + { + struct + { + STORE_CERTIFICATE_STATUS status; + X509 *certificate; + } x509; + X509_CRL *crl; + EVP_PKEY *key; + BIGNUM *number; + BUF_MEM *arbitrary; + } data; + } STORE_OBJECT; +DECLARE_STACK_OF(STORE_OBJECT) +STORE_OBJECT *STORE_OBJECT_new(void); +void STORE_OBJECT_free(STORE_OBJECT *data); + + + +/* The following functions handle the storage. They return 0, a negative number + or NULL on error, anything else on success. */ +X509 *STORE_get_certificate(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_store_certificate(STORE *e, X509 *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_modify_certificate(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]); +int STORE_revoke_certificate(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_delete_certificate(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +void *STORE_list_certificate_start(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +X509 *STORE_list_certificate_next(STORE *e, void *handle); +int STORE_list_certificate_end(STORE *e, void *handle); +int STORE_list_certificate_endp(STORE *e, void *handle); +EVP_PKEY *STORE_generate_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +EVP_PKEY *STORE_get_private_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_store_private_key(STORE *e, EVP_PKEY *data, + OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); +int STORE_modify_private_key(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]); +int STORE_revoke_private_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_delete_private_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +void *STORE_list_private_key_start(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +EVP_PKEY *STORE_list_private_key_next(STORE *e, void *handle); +int STORE_list_private_key_end(STORE *e, void *handle); +int STORE_list_private_key_endp(STORE *e, void *handle); +EVP_PKEY *STORE_get_public_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_store_public_key(STORE *e, EVP_PKEY *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_modify_public_key(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]); +int STORE_revoke_public_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_delete_public_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +void *STORE_list_public_key_start(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +EVP_PKEY *STORE_list_public_key_next(STORE *e, void *handle); +int STORE_list_public_key_end(STORE *e, void *handle); +int STORE_list_public_key_endp(STORE *e, void *handle); +X509_CRL *STORE_generate_crl(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +X509_CRL *STORE_get_crl(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_store_crl(STORE *e, X509_CRL *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_modify_crl(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]); +int STORE_delete_crl(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +void *STORE_list_crl_start(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +X509_CRL *STORE_list_crl_next(STORE *e, void *handle); +int STORE_list_crl_end(STORE *e, void *handle); +int STORE_list_crl_endp(STORE *e, void *handle); +int STORE_store_number(STORE *e, BIGNUM *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_modify_number(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]); +BIGNUM *STORE_get_number(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_delete_number(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_store_arbitrary(STORE *e, BUF_MEM *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_modify_arbitrary(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]); +BUF_MEM *STORE_get_arbitrary(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_delete_arbitrary(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); + + +/* Create and manipulate methods */ +STORE_METHOD *STORE_create_method(char *name); +void STORE_destroy_method(STORE_METHOD *store_method); + +/* These callback types are use for store handlers */ +typedef int (*STORE_INITIALISE_FUNC_PTR)(STORE *); +typedef void (*STORE_CLEANUP_FUNC_PTR)(STORE *); +typedef STORE_OBJECT *(*STORE_GENERATE_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); +typedef STORE_OBJECT *(*STORE_GET_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); +typedef void *(*STORE_START_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); +typedef STORE_OBJECT *(*STORE_NEXT_OBJECT_FUNC_PTR)(STORE *, void *handle); +typedef int (*STORE_END_OBJECT_FUNC_PTR)(STORE *, void *handle); +typedef int (*STORE_HANDLE_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); +typedef int (*STORE_STORE_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, STORE_OBJECT *data, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); +typedef int (*STORE_MODIFY_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, OPENSSL_ITEM search_attributes[], OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[], OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]); +typedef int (*STORE_GENERIC_FUNC_PTR)(STORE *, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); +typedef int (*STORE_CTRL_FUNC_PTR)(STORE *, int cmd, long l, void *p, void (*f)(void)); + +int STORE_method_set_initialise_function(STORE_METHOD *sm, STORE_INITIALISE_FUNC_PTR init_f); +int STORE_method_set_cleanup_function(STORE_METHOD *sm, STORE_CLEANUP_FUNC_PTR clean_f); +int STORE_method_set_generate_function(STORE_METHOD *sm, STORE_GENERATE_OBJECT_FUNC_PTR generate_f); +int STORE_method_set_get_function(STORE_METHOD *sm, STORE_GET_OBJECT_FUNC_PTR get_f); +int STORE_method_set_store_function(STORE_METHOD *sm, STORE_STORE_OBJECT_FUNC_PTR store_f); +int STORE_method_set_modify_function(STORE_METHOD *sm, STORE_MODIFY_OBJECT_FUNC_PTR store_f); +int STORE_method_set_revoke_function(STORE_METHOD *sm, STORE_HANDLE_OBJECT_FUNC_PTR revoke_f); +int STORE_method_set_delete_function(STORE_METHOD *sm, STORE_HANDLE_OBJECT_FUNC_PTR delete_f); +int STORE_method_set_list_start_function(STORE_METHOD *sm, STORE_START_OBJECT_FUNC_PTR list_start_f); +int STORE_method_set_list_next_function(STORE_METHOD *sm, STORE_NEXT_OBJECT_FUNC_PTR list_next_f); +int STORE_method_set_list_end_function(STORE_METHOD *sm, STORE_END_OBJECT_FUNC_PTR list_end_f); +int STORE_method_set_update_store_function(STORE_METHOD *sm, STORE_GENERIC_FUNC_PTR); +int STORE_method_set_lock_store_function(STORE_METHOD *sm, STORE_GENERIC_FUNC_PTR); +int STORE_method_set_unlock_store_function(STORE_METHOD *sm, STORE_GENERIC_FUNC_PTR); +int STORE_method_set_ctrl_function(STORE_METHOD *sm, STORE_CTRL_FUNC_PTR ctrl_f); + +STORE_INITIALISE_FUNC_PTR STORE_method_get_initialise_function(STORE_METHOD *sm); +STORE_CLEANUP_FUNC_PTR STORE_method_get_cleanup_function(STORE_METHOD *sm); +STORE_GENERATE_OBJECT_FUNC_PTR STORE_method_get_generate_function(STORE_METHOD *sm); +STORE_GET_OBJECT_FUNC_PTR STORE_method_get_get_function(STORE_METHOD *sm); +STORE_STORE_OBJECT_FUNC_PTR STORE_method_get_store_function(STORE_METHOD *sm); +STORE_MODIFY_OBJECT_FUNC_PTR STORE_method_get_modify_function(STORE_METHOD *sm); +STORE_HANDLE_OBJECT_FUNC_PTR STORE_method_get_revoke_function(STORE_METHOD *sm); +STORE_HANDLE_OBJECT_FUNC_PTR STORE_method_get_delete_function(STORE_METHOD *sm); +STORE_START_OBJECT_FUNC_PTR STORE_method_get_list_start_function(STORE_METHOD *sm); +STORE_NEXT_OBJECT_FUNC_PTR STORE_method_get_list_next_function(STORE_METHOD *sm); +STORE_END_OBJECT_FUNC_PTR STORE_method_get_list_end_function(STORE_METHOD *sm); +STORE_GENERIC_FUNC_PTR STORE_method_get_update_store_function(STORE_METHOD *sm); +STORE_GENERIC_FUNC_PTR STORE_method_get_lock_store_function(STORE_METHOD *sm); +STORE_GENERIC_FUNC_PTR STORE_method_get_unlock_store_function(STORE_METHOD *sm); +STORE_CTRL_FUNC_PTR STORE_method_get_ctrl_function(STORE_METHOD *sm); + +/* Method helper structures and functions. */ + +/* This structure is the result of parsing through the information in a list + of OPENSSL_ITEMs. It stores all the necessary information in a structured + way.*/ +typedef struct STORE_attr_info_st STORE_ATTR_INFO; + +/* Parse a list of OPENSSL_ITEMs and return a pointer to a STORE_ATTR_INFO. + Note that we do this in the list form, since the list of OPENSSL_ITEMs can + come in blocks separated with STORE_ATTR_OR. Note that the value returned + by STORE_parse_attrs_next() must be freed with STORE_ATTR_INFO_free(). */ +void *STORE_parse_attrs_start(OPENSSL_ITEM *attributes); +STORE_ATTR_INFO *STORE_parse_attrs_next(void *handle); +int STORE_parse_attrs_end(void *handle); +int STORE_parse_attrs_endp(void *handle); + +/* Creator and destructor */ +STORE_ATTR_INFO *STORE_ATTR_INFO_new(void); +int STORE_ATTR_INFO_free(STORE_ATTR_INFO *attrs); + +/* Manipulators */ +char *STORE_ATTR_INFO_get0_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code); +unsigned char *STORE_ATTR_INFO_get0_sha1str(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code); +X509_NAME *STORE_ATTR_INFO_get0_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code); +BIGNUM *STORE_ATTR_INFO_get0_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code); +int STORE_ATTR_INFO_set_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + char *cstr, size_t cstr_size); +int STORE_ATTR_INFO_set_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + unsigned char *sha1str, size_t sha1str_size); +int STORE_ATTR_INFO_set_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + X509_NAME *dn); +int STORE_ATTR_INFO_set_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + BIGNUM *number); +int STORE_ATTR_INFO_modify_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + char *cstr, size_t cstr_size); +int STORE_ATTR_INFO_modify_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + unsigned char *sha1str, size_t sha1str_size); +int STORE_ATTR_INFO_modify_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + X509_NAME *dn); +int STORE_ATTR_INFO_modify_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + BIGNUM *number); + +/* Compare on basis of a bit pattern formed by the STORE_ATTR_TYPES values + in each contained attribute. */ +int STORE_ATTR_INFO_compare(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b); +/* Check if the set of attributes in a is within the range of attributes + set in b. */ +int STORE_ATTR_INFO_in_range(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b); +/* Check if the set of attributes in a are also set in b. */ +int STORE_ATTR_INFO_in(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b); +/* Same as STORE_ATTR_INFO_in(), but also checks the attribute values. */ +int STORE_ATTR_INFO_in_ex(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b); + + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_STORE_strings(void); + +/* Error codes for the STORE functions. */ + +/* Function codes. */ +#define STORE_F_MEM_DELETE 134 +#define STORE_F_MEM_GENERATE 135 +#define STORE_F_MEM_LIST_END 168 +#define STORE_F_MEM_LIST_NEXT 136 +#define STORE_F_MEM_LIST_START 137 +#define STORE_F_MEM_MODIFY 169 +#define STORE_F_MEM_STORE 138 +#define STORE_F_STORE_ATTR_INFO_GET0_CSTR 139 +#define STORE_F_STORE_ATTR_INFO_GET0_DN 140 +#define STORE_F_STORE_ATTR_INFO_GET0_NUMBER 141 +#define STORE_F_STORE_ATTR_INFO_GET0_SHA1STR 142 +#define STORE_F_STORE_ATTR_INFO_MODIFY_CSTR 143 +#define STORE_F_STORE_ATTR_INFO_MODIFY_DN 144 +#define STORE_F_STORE_ATTR_INFO_MODIFY_NUMBER 145 +#define STORE_F_STORE_ATTR_INFO_MODIFY_SHA1STR 146 +#define STORE_F_STORE_ATTR_INFO_SET_CSTR 147 +#define STORE_F_STORE_ATTR_INFO_SET_DN 148 +#define STORE_F_STORE_ATTR_INFO_SET_NUMBER 149 +#define STORE_F_STORE_ATTR_INFO_SET_SHA1STR 150 +#define STORE_F_STORE_CERTIFICATE 170 +#define STORE_F_STORE_CTRL 161 +#define STORE_F_STORE_DELETE_ARBITRARY 158 +#define STORE_F_STORE_DELETE_CERTIFICATE 102 +#define STORE_F_STORE_DELETE_CRL 103 +#define STORE_F_STORE_DELETE_NUMBER 104 +#define STORE_F_STORE_DELETE_PRIVATE_KEY 105 +#define STORE_F_STORE_DELETE_PUBLIC_KEY 106 +#define STORE_F_STORE_GENERATE_CRL 107 +#define STORE_F_STORE_GENERATE_KEY 108 +#define STORE_F_STORE_GET_ARBITRARY 159 +#define STORE_F_STORE_GET_CERTIFICATE 109 +#define STORE_F_STORE_GET_CRL 110 +#define STORE_F_STORE_GET_NUMBER 111 +#define STORE_F_STORE_GET_PRIVATE_KEY 112 +#define STORE_F_STORE_GET_PUBLIC_KEY 113 +#define STORE_F_STORE_LIST_CERTIFICATE_END 114 +#define STORE_F_STORE_LIST_CERTIFICATE_ENDP 153 +#define STORE_F_STORE_LIST_CERTIFICATE_NEXT 115 +#define STORE_F_STORE_LIST_CERTIFICATE_START 116 +#define STORE_F_STORE_LIST_CRL_END 117 +#define STORE_F_STORE_LIST_CRL_ENDP 154 +#define STORE_F_STORE_LIST_CRL_NEXT 118 +#define STORE_F_STORE_LIST_CRL_START 119 +#define STORE_F_STORE_LIST_PRIVATE_KEY_END 120 +#define STORE_F_STORE_LIST_PRIVATE_KEY_ENDP 155 +#define STORE_F_STORE_LIST_PRIVATE_KEY_NEXT 121 +#define STORE_F_STORE_LIST_PRIVATE_KEY_START 122 +#define STORE_F_STORE_LIST_PUBLIC_KEY_END 123 +#define STORE_F_STORE_LIST_PUBLIC_KEY_ENDP 156 +#define STORE_F_STORE_LIST_PUBLIC_KEY_NEXT 124 +#define STORE_F_STORE_LIST_PUBLIC_KEY_START 125 +#define STORE_F_STORE_MODIFY_ARBITRARY 162 +#define STORE_F_STORE_MODIFY_CERTIFICATE 163 +#define STORE_F_STORE_MODIFY_CRL 164 +#define STORE_F_STORE_MODIFY_NUMBER 165 +#define STORE_F_STORE_MODIFY_PRIVATE_KEY 166 +#define STORE_F_STORE_MODIFY_PUBLIC_KEY 167 +#define STORE_F_STORE_NEW_ENGINE 133 +#define STORE_F_STORE_NEW_METHOD 132 +#define STORE_F_STORE_PARSE_ATTRS_END 151 +#define STORE_F_STORE_PARSE_ATTRS_ENDP 172 +#define STORE_F_STORE_PARSE_ATTRS_NEXT 152 +#define STORE_F_STORE_PARSE_ATTRS_START 171 +#define STORE_F_STORE_REVOKE_CERTIFICATE 129 +#define STORE_F_STORE_REVOKE_PRIVATE_KEY 130 +#define STORE_F_STORE_REVOKE_PUBLIC_KEY 131 +#define STORE_F_STORE_STORE_ARBITRARY 157 +#define STORE_F_STORE_STORE_CERTIFICATE 100 +#define STORE_F_STORE_STORE_CRL 101 +#define STORE_F_STORE_STORE_NUMBER 126 +#define STORE_F_STORE_STORE_PRIVATE_KEY 127 +#define STORE_F_STORE_STORE_PUBLIC_KEY 128 + +/* Reason codes. */ +#define STORE_R_ALREADY_HAS_A_VALUE 127 +#define STORE_R_FAILED_DELETING_ARBITRARY 132 +#define STORE_R_FAILED_DELETING_CERTIFICATE 100 +#define STORE_R_FAILED_DELETING_KEY 101 +#define STORE_R_FAILED_DELETING_NUMBER 102 +#define STORE_R_FAILED_GENERATING_CRL 103 +#define STORE_R_FAILED_GENERATING_KEY 104 +#define STORE_R_FAILED_GETTING_ARBITRARY 133 +#define STORE_R_FAILED_GETTING_CERTIFICATE 105 +#define STORE_R_FAILED_GETTING_KEY 106 +#define STORE_R_FAILED_GETTING_NUMBER 107 +#define STORE_R_FAILED_LISTING_CERTIFICATES 108 +#define STORE_R_FAILED_LISTING_KEYS 109 +#define STORE_R_FAILED_MODIFYING_ARBITRARY 138 +#define STORE_R_FAILED_MODIFYING_CERTIFICATE 139 +#define STORE_R_FAILED_MODIFYING_CRL 140 +#define STORE_R_FAILED_MODIFYING_NUMBER 141 +#define STORE_R_FAILED_MODIFYING_PRIVATE_KEY 142 +#define STORE_R_FAILED_MODIFYING_PUBLIC_KEY 143 +#define STORE_R_FAILED_REVOKING_CERTIFICATE 110 +#define STORE_R_FAILED_REVOKING_KEY 111 +#define STORE_R_FAILED_STORING_ARBITRARY 134 +#define STORE_R_FAILED_STORING_CERTIFICATE 112 +#define STORE_R_FAILED_STORING_KEY 113 +#define STORE_R_FAILED_STORING_NUMBER 114 +#define STORE_R_NOT_IMPLEMENTED 128 +#define STORE_R_NO_CONTROL_FUNCTION 144 +#define STORE_R_NO_DELETE_ARBITRARY_FUNCTION 135 +#define STORE_R_NO_DELETE_NUMBER_FUNCTION 115 +#define STORE_R_NO_DELETE_OBJECT_FUNCTION 116 +#define STORE_R_NO_GENERATE_CRL_FUNCTION 117 +#define STORE_R_NO_GENERATE_OBJECT_FUNCTION 118 +#define STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION 136 +#define STORE_R_NO_GET_OBJECT_FUNCTION 119 +#define STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION 120 +#define STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION 131 +#define STORE_R_NO_LIST_OBJECT_END_FUNCTION 121 +#define STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION 122 +#define STORE_R_NO_LIST_OBJECT_START_FUNCTION 123 +#define STORE_R_NO_MODIFY_OBJECT_FUNCTION 145 +#define STORE_R_NO_REVOKE_OBJECT_FUNCTION 124 +#define STORE_R_NO_STORE 129 +#define STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION 137 +#define STORE_R_NO_STORE_OBJECT_FUNCTION 125 +#define STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION 126 +#define STORE_R_NO_VALUE 130 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/symhacks.h b/mswin32/OpenSSL/include/openssl/symhacks.h new file mode 100755 index 000000000..7e3602d2e --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/symhacks.h @@ -0,0 +1,383 @@ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SYMHACKS_H +#define HEADER_SYMHACKS_H + +#include + +/* Hacks to solve the problem with linkers incapable of handling very long + symbol names. In the case of VMS, the limit is 31 characters on VMS for + VAX. */ +#ifdef OPENSSL_SYS_VMS + +/* Hack a long name in crypto/ex_data.c */ +#undef CRYPTO_get_ex_data_implementation +#define CRYPTO_get_ex_data_implementation CRYPTO_get_ex_data_impl +#undef CRYPTO_set_ex_data_implementation +#define CRYPTO_set_ex_data_implementation CRYPTO_set_ex_data_impl + +/* Hack a long name in crypto/asn1/a_mbstr.c */ +#undef ASN1_STRING_set_default_mask_asc +#define ASN1_STRING_set_default_mask_asc ASN1_STRING_set_def_mask_asc + +#if 0 /* No longer needed, since safestack macro magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO) */ +#undef i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO +#define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO i2d_ASN1_SET_OF_PKCS7_SIGINF +#undef d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO +#define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO d2i_ASN1_SET_OF_PKCS7_SIGINF +#endif + +#if 0 /* No longer needed, since safestack macro magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO) */ +#undef i2d_ASN1_SET_OF_PKCS7_RECIP_INFO +#define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO i2d_ASN1_SET_OF_PKCS7_RECINF +#undef d2i_ASN1_SET_OF_PKCS7_RECIP_INFO +#define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO d2i_ASN1_SET_OF_PKCS7_RECINF +#endif + +#if 0 /* No longer needed, since safestack macro magic does the job */ +/* Hack the names created with DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION) */ +#undef i2d_ASN1_SET_OF_ACCESS_DESCRIPTION +#define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION i2d_ASN1_SET_OF_ACC_DESC +#undef d2i_ASN1_SET_OF_ACCESS_DESCRIPTION +#define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION d2i_ASN1_SET_OF_ACC_DESC +#endif + +/* Hack the names created with DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE) */ +#undef PEM_read_NETSCAPE_CERT_SEQUENCE +#define PEM_read_NETSCAPE_CERT_SEQUENCE PEM_read_NS_CERT_SEQ +#undef PEM_write_NETSCAPE_CERT_SEQUENCE +#define PEM_write_NETSCAPE_CERT_SEQUENCE PEM_write_NS_CERT_SEQ +#undef PEM_read_bio_NETSCAPE_CERT_SEQUENCE +#define PEM_read_bio_NETSCAPE_CERT_SEQUENCE PEM_read_bio_NS_CERT_SEQ +#undef PEM_write_bio_NETSCAPE_CERT_SEQUENCE +#define PEM_write_bio_NETSCAPE_CERT_SEQUENCE PEM_write_bio_NS_CERT_SEQ +#undef PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE +#define PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE PEM_write_cb_bio_NS_CERT_SEQ + +/* Hack the names created with DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO) */ +#undef PEM_read_PKCS8_PRIV_KEY_INFO +#define PEM_read_PKCS8_PRIV_KEY_INFO PEM_read_P8_PRIV_KEY_INFO +#undef PEM_write_PKCS8_PRIV_KEY_INFO +#define PEM_write_PKCS8_PRIV_KEY_INFO PEM_write_P8_PRIV_KEY_INFO +#undef PEM_read_bio_PKCS8_PRIV_KEY_INFO +#define PEM_read_bio_PKCS8_PRIV_KEY_INFO PEM_read_bio_P8_PRIV_KEY_INFO +#undef PEM_write_bio_PKCS8_PRIV_KEY_INFO +#define PEM_write_bio_PKCS8_PRIV_KEY_INFO PEM_write_bio_P8_PRIV_KEY_INFO +#undef PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO +#define PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO PEM_wrt_cb_bio_P8_PRIV_KEY_INFO + +/* Hack other PEM names */ +#undef PEM_write_bio_PKCS8PrivateKey_nid +#define PEM_write_bio_PKCS8PrivateKey_nid PEM_write_bio_PKCS8PrivKey_nid + +/* Hack some long X509 names */ +#undef X509_REVOKED_get_ext_by_critical +#define X509_REVOKED_get_ext_by_critical X509_REVOKED_get_ext_by_critic +#undef X509_policy_tree_get0_user_policies +#define X509_policy_tree_get0_user_policies X509_pcy_tree_get0_usr_policies +#undef X509_policy_node_get0_qualifiers +#define X509_policy_node_get0_qualifiers X509_pcy_node_get0_qualifiers +#undef X509_STORE_CTX_get_explicit_policy +#define X509_STORE_CTX_get_explicit_policy X509_STORE_CTX_get_expl_policy + +/* Hack some long CRYPTO names */ +#undef CRYPTO_set_dynlock_destroy_callback +#define CRYPTO_set_dynlock_destroy_callback CRYPTO_set_dynlock_destroy_cb +#undef CRYPTO_set_dynlock_create_callback +#define CRYPTO_set_dynlock_create_callback CRYPTO_set_dynlock_create_cb +#undef CRYPTO_set_dynlock_lock_callback +#define CRYPTO_set_dynlock_lock_callback CRYPTO_set_dynlock_lock_cb +#undef CRYPTO_get_dynlock_lock_callback +#define CRYPTO_get_dynlock_lock_callback CRYPTO_get_dynlock_lock_cb +#undef CRYPTO_get_dynlock_destroy_callback +#define CRYPTO_get_dynlock_destroy_callback CRYPTO_get_dynlock_destroy_cb +#undef CRYPTO_get_dynlock_create_callback +#define CRYPTO_get_dynlock_create_callback CRYPTO_get_dynlock_create_cb +#undef CRYPTO_set_locked_mem_ex_functions +#define CRYPTO_set_locked_mem_ex_functions CRYPTO_set_locked_mem_ex_funcs +#undef CRYPTO_get_locked_mem_ex_functions +#define CRYPTO_get_locked_mem_ex_functions CRYPTO_get_locked_mem_ex_funcs + +/* Hack some long SSL names */ +#undef SSL_CTX_set_default_verify_paths +#define SSL_CTX_set_default_verify_paths SSL_CTX_set_def_verify_paths +#undef SSL_get_ex_data_X509_STORE_CTX_idx +#define SSL_get_ex_data_X509_STORE_CTX_idx SSL_get_ex_d_X509_STORE_CTX_idx +#undef SSL_add_file_cert_subjects_to_stack +#define SSL_add_file_cert_subjects_to_stack SSL_add_file_cert_subjs_to_stk +#undef SSL_add_dir_cert_subjects_to_stack +#define SSL_add_dir_cert_subjects_to_stack SSL_add_dir_cert_subjs_to_stk +#undef SSL_CTX_use_certificate_chain_file +#define SSL_CTX_use_certificate_chain_file SSL_CTX_use_cert_chain_file +#undef SSL_CTX_set_cert_verify_callback +#define SSL_CTX_set_cert_verify_callback SSL_CTX_set_cert_verify_cb +#undef SSL_CTX_set_default_passwd_cb_userdata +#define SSL_CTX_set_default_passwd_cb_userdata SSL_CTX_set_def_passwd_cb_ud +#undef SSL_COMP_get_compression_methods +#define SSL_COMP_get_compression_methods SSL_COMP_get_compress_methods + +/* Hack some long ENGINE names */ +#undef ENGINE_get_default_BN_mod_exp_crt +#define ENGINE_get_default_BN_mod_exp_crt ENGINE_get_def_BN_mod_exp_crt +#undef ENGINE_set_default_BN_mod_exp_crt +#define ENGINE_set_default_BN_mod_exp_crt ENGINE_set_def_BN_mod_exp_crt +#undef ENGINE_set_load_privkey_function +#define ENGINE_set_load_privkey_function ENGINE_set_load_privkey_fn +#undef ENGINE_get_load_privkey_function +#define ENGINE_get_load_privkey_function ENGINE_get_load_privkey_fn + +/* Hack some long OCSP names */ +#undef OCSP_REQUEST_get_ext_by_critical +#define OCSP_REQUEST_get_ext_by_critical OCSP_REQUEST_get_ext_by_crit +#undef OCSP_BASICRESP_get_ext_by_critical +#define OCSP_BASICRESP_get_ext_by_critical OCSP_BASICRESP_get_ext_by_crit +#undef OCSP_SINGLERESP_get_ext_by_critical +#define OCSP_SINGLERESP_get_ext_by_critical OCSP_SINGLERESP_get_ext_by_crit + +/* Hack some long DES names */ +#undef _ossl_old_des_ede3_cfb64_encrypt +#define _ossl_old_des_ede3_cfb64_encrypt _ossl_odes_ede3_cfb64_encrypt +#undef _ossl_old_des_ede3_ofb64_encrypt +#define _ossl_old_des_ede3_ofb64_encrypt _ossl_odes_ede3_ofb64_encrypt + +/* Hack some long EVP names */ +#undef OPENSSL_add_all_algorithms_noconf +#define OPENSSL_add_all_algorithms_noconf OPENSSL_add_all_algo_noconf +#undef OPENSSL_add_all_algorithms_conf +#define OPENSSL_add_all_algorithms_conf OPENSSL_add_all_algo_conf + +/* Hack some long EC names */ +#undef EC_GROUP_set_point_conversion_form +#define EC_GROUP_set_point_conversion_form EC_GROUP_set_point_conv_form +#undef EC_GROUP_get_point_conversion_form +#define EC_GROUP_get_point_conversion_form EC_GROUP_get_point_conv_form +#undef EC_GROUP_clear_free_all_extra_data +#define EC_GROUP_clear_free_all_extra_data EC_GROUP_clr_free_all_xtra_data +#undef EC_POINT_set_Jprojective_coordinates_GFp +#define EC_POINT_set_Jprojective_coordinates_GFp \ + EC_POINT_set_Jproj_coords_GFp +#undef EC_POINT_get_Jprojective_coordinates_GFp +#define EC_POINT_get_Jprojective_coordinates_GFp \ + EC_POINT_get_Jproj_coords_GFp +#undef EC_POINT_set_affine_coordinates_GFp +#define EC_POINT_set_affine_coordinates_GFp EC_POINT_set_affine_coords_GFp +#undef EC_POINT_get_affine_coordinates_GFp +#define EC_POINT_get_affine_coordinates_GFp EC_POINT_get_affine_coords_GFp +#undef EC_POINT_set_compressed_coordinates_GFp +#define EC_POINT_set_compressed_coordinates_GFp EC_POINT_set_compr_coords_GFp +#undef EC_POINT_set_affine_coordinates_GF2m +#define EC_POINT_set_affine_coordinates_GF2m EC_POINT_set_affine_coords_GF2m +#undef EC_POINT_get_affine_coordinates_GF2m +#define EC_POINT_get_affine_coordinates_GF2m EC_POINT_get_affine_coords_GF2m +#undef EC_POINT_set_compressed_coordinates_GF2m +#define EC_POINT_set_compressed_coordinates_GF2m \ + EC_POINT_set_compr_coords_GF2m +#undef ec_GF2m_simple_group_clear_finish +#define ec_GF2m_simple_group_clear_finish ec_GF2m_simple_grp_clr_finish +#undef ec_GF2m_simple_group_check_discriminant +#define ec_GF2m_simple_group_check_discriminant ec_GF2m_simple_grp_chk_discrim +#undef ec_GF2m_simple_point_clear_finish +#define ec_GF2m_simple_point_clear_finish ec_GF2m_simple_pt_clr_finish +#undef ec_GF2m_simple_point_set_to_infinity +#define ec_GF2m_simple_point_set_to_infinity ec_GF2m_simple_pt_set_to_inf +#undef ec_GF2m_simple_points_make_affine +#define ec_GF2m_simple_points_make_affine ec_GF2m_simple_pts_make_affine +#undef ec_GF2m_simple_point_set_affine_coordinates +#define ec_GF2m_simple_point_set_affine_coordinates \ + ec_GF2m_smp_pt_set_af_coords +#undef ec_GF2m_simple_point_get_affine_coordinates +#define ec_GF2m_simple_point_get_affine_coordinates \ + ec_GF2m_smp_pt_get_af_coords +#undef ec_GF2m_simple_set_compressed_coordinates +#define ec_GF2m_simple_set_compressed_coordinates \ + ec_GF2m_smp_set_compr_coords +#undef ec_GFp_simple_group_set_curve_GFp +#define ec_GFp_simple_group_set_curve_GFp ec_GFp_simple_grp_set_curve_GFp +#undef ec_GFp_simple_group_get_curve_GFp +#define ec_GFp_simple_group_get_curve_GFp ec_GFp_simple_grp_get_curve_GFp +#undef ec_GFp_simple_group_clear_finish +#define ec_GFp_simple_group_clear_finish ec_GFp_simple_grp_clear_finish +#undef ec_GFp_simple_group_set_generator +#define ec_GFp_simple_group_set_generator ec_GFp_simple_grp_set_generator +#undef ec_GFp_simple_group_get0_generator +#define ec_GFp_simple_group_get0_generator ec_GFp_simple_grp_gt0_generator +#undef ec_GFp_simple_group_get_cofactor +#define ec_GFp_simple_group_get_cofactor ec_GFp_simple_grp_get_cofactor +#undef ec_GFp_simple_point_clear_finish +#define ec_GFp_simple_point_clear_finish ec_GFp_simple_pt_clear_finish +#undef ec_GFp_simple_point_set_to_infinity +#define ec_GFp_simple_point_set_to_infinity ec_GFp_simple_pt_set_to_inf +#undef ec_GFp_simple_points_make_affine +#define ec_GFp_simple_points_make_affine ec_GFp_simple_pts_make_affine +#undef ec_GFp_simple_group_get_curve_GFp +#define ec_GFp_simple_group_get_curve_GFp ec_GFp_simple_grp_get_curve_GFp +#undef ec_GFp_simple_set_Jprojective_coordinates_GFp +#define ec_GFp_simple_set_Jprojective_coordinates_GFp \ + ec_GFp_smp_set_Jproj_coords_GFp +#undef ec_GFp_simple_get_Jprojective_coordinates_GFp +#define ec_GFp_simple_get_Jprojective_coordinates_GFp \ + ec_GFp_smp_get_Jproj_coords_GFp +#undef ec_GFp_simple_point_set_affine_coordinates_GFp +#define ec_GFp_simple_point_set_affine_coordinates_GFp \ + ec_GFp_smp_pt_set_af_coords_GFp +#undef ec_GFp_simple_point_get_affine_coordinates_GFp +#define ec_GFp_simple_point_get_affine_coordinates_GFp \ + ec_GFp_smp_pt_get_af_coords_GFp +#undef ec_GFp_simple_set_compressed_coordinates_GFp +#define ec_GFp_simple_set_compressed_coordinates_GFp \ + ec_GFp_smp_set_compr_coords_GFp +#undef ec_GFp_simple_point_set_affine_coordinates +#define ec_GFp_simple_point_set_affine_coordinates \ + ec_GFp_smp_pt_set_af_coords +#undef ec_GFp_simple_point_get_affine_coordinates +#define ec_GFp_simple_point_get_affine_coordinates \ + ec_GFp_smp_pt_get_af_coords +#undef ec_GFp_simple_set_compressed_coordinates +#define ec_GFp_simple_set_compressed_coordinates \ + ec_GFp_smp_set_compr_coords +#undef ec_GFp_simple_group_check_discriminant +#define ec_GFp_simple_group_check_discriminant ec_GFp_simple_grp_chk_discrim + +/* Hack som long STORE names */ +#undef STORE_method_set_initialise_function +#define STORE_method_set_initialise_function STORE_meth_set_initialise_fn +#undef STORE_method_set_cleanup_function +#define STORE_method_set_cleanup_function STORE_meth_set_cleanup_fn +#undef STORE_method_set_generate_function +#define STORE_method_set_generate_function STORE_meth_set_generate_fn +#undef STORE_method_set_modify_function +#define STORE_method_set_modify_function STORE_meth_set_modify_fn +#undef STORE_method_set_revoke_function +#define STORE_method_set_revoke_function STORE_meth_set_revoke_fn +#undef STORE_method_set_delete_function +#define STORE_method_set_delete_function STORE_meth_set_delete_fn +#undef STORE_method_set_list_start_function +#define STORE_method_set_list_start_function STORE_meth_set_list_start_fn +#undef STORE_method_set_list_next_function +#define STORE_method_set_list_next_function STORE_meth_set_list_next_fn +#undef STORE_method_set_list_end_function +#define STORE_method_set_list_end_function STORE_meth_set_list_end_fn +#undef STORE_method_set_update_store_function +#define STORE_method_set_update_store_function STORE_meth_set_update_store_fn +#undef STORE_method_set_lock_store_function +#define STORE_method_set_lock_store_function STORE_meth_set_lock_store_fn +#undef STORE_method_set_unlock_store_function +#define STORE_method_set_unlock_store_function STORE_meth_set_unlock_store_fn +#undef STORE_method_get_initialise_function +#define STORE_method_get_initialise_function STORE_meth_get_initialise_fn +#undef STORE_method_get_cleanup_function +#define STORE_method_get_cleanup_function STORE_meth_get_cleanup_fn +#undef STORE_method_get_generate_function +#define STORE_method_get_generate_function STORE_meth_get_generate_fn +#undef STORE_method_get_modify_function +#define STORE_method_get_modify_function STORE_meth_get_modify_fn +#undef STORE_method_get_revoke_function +#define STORE_method_get_revoke_function STORE_meth_get_revoke_fn +#undef STORE_method_get_delete_function +#define STORE_method_get_delete_function STORE_meth_get_delete_fn +#undef STORE_method_get_list_start_function +#define STORE_method_get_list_start_function STORE_meth_get_list_start_fn +#undef STORE_method_get_list_next_function +#define STORE_method_get_list_next_function STORE_meth_get_list_next_fn +#undef STORE_method_get_list_end_function +#define STORE_method_get_list_end_function STORE_meth_get_list_end_fn +#undef STORE_method_get_update_store_function +#define STORE_method_get_update_store_function STORE_meth_get_update_store_fn +#undef STORE_method_get_lock_store_function +#define STORE_method_get_lock_store_function STORE_meth_get_lock_store_fn +#undef STORE_method_get_unlock_store_function +#define STORE_method_get_unlock_store_function STORE_meth_get_unlock_store_fn + +#endif /* defined OPENSSL_SYS_VMS */ + + +/* Case insensiteve linking causes problems.... */ +#if defined(OPENSSL_SYS_WIN16) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) +#undef ERR_load_CRYPTO_strings +#define ERR_load_CRYPTO_strings ERR_load_CRYPTOlib_strings +#undef OCSP_crlID_new +#define OCSP_crlID_new OCSP_crlID2_new + +#undef d2i_ECPARAMETERS +#define d2i_ECPARAMETERS d2i_UC_ECPARAMETERS +#undef i2d_ECPARAMETERS +#define i2d_ECPARAMETERS i2d_UC_ECPARAMETERS +#undef d2i_ECPKPARAMETERS +#define d2i_ECPKPARAMETERS d2i_UC_ECPKPARAMETERS +#undef i2d_ECPKPARAMETERS +#define i2d_ECPKPARAMETERS i2d_UC_ECPKPARAMETERS + +/* These functions do not seem to exist! However, I'm paranoid... + Original command in x509v3.h: + These functions are being redefined in another directory, + and clash when the linker is case-insensitive, so let's + hide them a little, by giving them an extra 'o' at the + beginning of the name... */ +#undef X509v3_cleanup_extensions +#define X509v3_cleanup_extensions oX509v3_cleanup_extensions +#undef X509v3_add_extension +#define X509v3_add_extension oX509v3_add_extension +#undef X509v3_add_netscape_extensions +#define X509v3_add_netscape_extensions oX509v3_add_netscape_extensions +#undef X509v3_add_standard_extensions +#define X509v3_add_standard_extensions oX509v3_add_standard_extensions + + +#endif + + +#endif /* ! defined HEADER_VMS_IDHACKS_H */ diff --git a/mswin32/OpenSSL/include/openssl/tls1.h b/mswin32/OpenSSL/include/openssl/tls1.h new file mode 100755 index 000000000..00399f988 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/tls1.h @@ -0,0 +1,374 @@ +/* ssl/tls1.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.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * ECC cipher suite support in OpenSSL originally written by + * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_TLS1_H +#define HEADER_TLS1_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES 0 + +#define TLS1_VERSION 0x0301 +#define TLS1_VERSION_MAJOR 0x03 +#define TLS1_VERSION_MINOR 0x01 + +#define TLS1_AD_DECRYPTION_FAILED 21 +#define TLS1_AD_RECORD_OVERFLOW 22 +#define TLS1_AD_UNKNOWN_CA 48 /* fatal */ +#define TLS1_AD_ACCESS_DENIED 49 /* fatal */ +#define TLS1_AD_DECODE_ERROR 50 /* fatal */ +#define TLS1_AD_DECRYPT_ERROR 51 +#define TLS1_AD_EXPORT_RESTRICTION 60 /* fatal */ +#define TLS1_AD_PROTOCOL_VERSION 70 /* fatal */ +#define TLS1_AD_INSUFFICIENT_SECURITY 71 /* fatal */ +#define TLS1_AD_INTERNAL_ERROR 80 /* fatal */ +#define TLS1_AD_USER_CANCELLED 90 +#define TLS1_AD_NO_RENEGOTIATION 100 +/* codes 110-114 are from RFC3546 */ +#define TLS1_AD_UNSUPPORTED_EXTENSION 110 +#define TLS1_AD_CERTIFICATE_UNOBTAINABLE 111 +#define TLS1_AD_UNRECOGNIZED_NAME 112 +#define TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE 113 +#define TLS1_AD_BAD_CERTIFICATE_HASH_VALUE 114 +#define TLS1_AD_UNKNOWN_PSK_IDENTITY 115 /* fatal */ + +/* ExtensionType values from RFC 3546 */ +#define TLSEXT_TYPE_server_name 0 +#define TLSEXT_TYPE_max_fragment_length 1 +#define TLSEXT_TYPE_client_certificate_url 2 +#define TLSEXT_TYPE_trusted_ca_keys 3 +#define TLSEXT_TYPE_truncated_hmac 4 +#define TLSEXT_TYPE_status_request 5 +#define TLSEXT_TYPE_elliptic_curves 10 +#define TLSEXT_TYPE_ec_point_formats 11 +#define TLSEXT_TYPE_session_ticket 35 + +/* NameType value from RFC 3546 */ +#define TLSEXT_NAMETYPE_host_name 0 + +#ifndef OPENSSL_NO_TLSEXT + +#define TLSEXT_MAXLEN_host_name 255 + +const char *SSL_get_servername(const SSL *s, const int type) ; +int SSL_get_servername_type(const SSL *s) ; + +#define SSL_set_tlsext_host_name(s,name) \ +SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,(char *)name) + +#define SSL_set_tlsext_debug_callback(ssl, cb) \ +SSL_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_CB,(void (*)(void))cb) + +#define SSL_set_tlsext_debug_arg(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_ARG,0, (void *)arg) + +#define SSL_CTX_set_tlsext_servername_callback(ctx, cb) \ +SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,(void (*)(void))cb) + +#define SSL_TLSEXT_ERR_OK 0 +#define SSL_TLSEXT_ERR_ALERT_WARNING 1 +#define SSL_TLSEXT_ERR_ALERT_FATAL 2 +#define SSL_TLSEXT_ERR_NOACK 3 + +#define SSL_CTX_set_tlsext_servername_arg(ctx, arg) \ +SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG,0, (void *)arg) + +#define SSL_CTX_get_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_GET_TLXEXT_TICKET_KEYS,(keylen),(keys)) +#define SSL_CTX_set_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_SET_TLXEXT_TICKET_KEYS,(keylen),(keys)) +#endif + +/* Additional TLS ciphersuites from draft-ietf-tls-56-bit-ciphersuites-00.txt + * (available if TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES is defined, see + * s3_lib.c). We actually treat them like SSL 3.0 ciphers, which we probably + * shouldn't. */ +#define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5 0x03000060 +#define TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 0x03000061 +#define TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA 0x03000062 +#define TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA 0x03000063 +#define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA 0x03000064 +#define TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA 0x03000065 +#define TLS1_CK_DHE_DSS_WITH_RC4_128_SHA 0x03000066 + +/* AES ciphersuites from RFC3268 */ + +#define TLS1_CK_RSA_WITH_AES_128_SHA 0x0300002F +#define TLS1_CK_DH_DSS_WITH_AES_128_SHA 0x03000030 +#define TLS1_CK_DH_RSA_WITH_AES_128_SHA 0x03000031 +#define TLS1_CK_DHE_DSS_WITH_AES_128_SHA 0x03000032 +#define TLS1_CK_DHE_RSA_WITH_AES_128_SHA 0x03000033 +#define TLS1_CK_ADH_WITH_AES_128_SHA 0x03000034 + +#define TLS1_CK_RSA_WITH_AES_256_SHA 0x03000035 +#define TLS1_CK_DH_DSS_WITH_AES_256_SHA 0x03000036 +#define TLS1_CK_DH_RSA_WITH_AES_256_SHA 0x03000037 +#define TLS1_CK_DHE_DSS_WITH_AES_256_SHA 0x03000038 +#define TLS1_CK_DHE_RSA_WITH_AES_256_SHA 0x03000039 +#define TLS1_CK_ADH_WITH_AES_256_SHA 0x0300003A + +/* Camellia ciphersuites from RFC4132 */ +#define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000041 +#define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000042 +#define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000043 +#define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000044 +#define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000045 +#define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA 0x03000046 + +#define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000084 +#define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000085 +#define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000086 +#define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000087 +#define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000088 +#define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA 0x03000089 + +/* SEED ciphersuites from RFC4162 */ +#define TLS1_CK_RSA_WITH_SEED_SHA 0x03000096 +#define TLS1_CK_DH_DSS_WITH_SEED_SHA 0x03000097 +#define TLS1_CK_DH_RSA_WITH_SEED_SHA 0x03000098 +#define TLS1_CK_DHE_DSS_WITH_SEED_SHA 0x03000099 +#define TLS1_CK_DHE_RSA_WITH_SEED_SHA 0x0300009A +#define TLS1_CK_ADH_WITH_SEED_SHA 0x0300009B + +/* ECC ciphersuites from draft-ietf-tls-ecc-12.txt with changes soon to be in draft 13 */ +#define TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA 0x0300C001 +#define TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA 0x0300C002 +#define TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C003 +#define TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0x0300C004 +#define TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0x0300C005 + +#define TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA 0x0300C006 +#define TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA 0x0300C007 +#define TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C008 +#define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0x0300C009 +#define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0x0300C00A + +#define TLS1_CK_ECDH_RSA_WITH_NULL_SHA 0x0300C00B +#define TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA 0x0300C00C +#define TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA 0x0300C00D +#define TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA 0x0300C00E +#define TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA 0x0300C00F + +#define TLS1_CK_ECDHE_RSA_WITH_NULL_SHA 0x0300C010 +#define TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA 0x0300C011 +#define TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA 0x0300C012 +#define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA 0x0300C013 +#define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA 0x0300C014 + +#define TLS1_CK_ECDH_anon_WITH_NULL_SHA 0x0300C015 +#define TLS1_CK_ECDH_anon_WITH_RC4_128_SHA 0x0300C016 +#define TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA 0x0300C017 +#define TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA 0x0300C018 +#define TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA 0x0300C019 + +/* XXX + * Inconsistency alert: + * The OpenSSL names of ciphers with ephemeral DH here include the string + * "DHE", while elsewhere it has always been "EDH". + * (The alias for the list of all such ciphers also is "EDH".) + * The specifications speak of "EDH"; maybe we should allow both forms + * for everything. */ +#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5 "EXP1024-RC4-MD5" +#define TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 "EXP1024-RC2-CBC-MD5" +#define TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DES-CBC-SHA" +#define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DHE-DSS-DES-CBC-SHA" +#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA "EXP1024-RC4-SHA" +#define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA "EXP1024-DHE-DSS-RC4-SHA" +#define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA "DHE-DSS-RC4-SHA" + +/* AES ciphersuites from RFC3268 */ +#define TLS1_TXT_RSA_WITH_AES_128_SHA "AES128-SHA" +#define TLS1_TXT_DH_DSS_WITH_AES_128_SHA "DH-DSS-AES128-SHA" +#define TLS1_TXT_DH_RSA_WITH_AES_128_SHA "DH-RSA-AES128-SHA" +#define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA "DHE-DSS-AES128-SHA" +#define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA "DHE-RSA-AES128-SHA" +#define TLS1_TXT_ADH_WITH_AES_128_SHA "ADH-AES128-SHA" + +#define TLS1_TXT_RSA_WITH_AES_256_SHA "AES256-SHA" +#define TLS1_TXT_DH_DSS_WITH_AES_256_SHA "DH-DSS-AES256-SHA" +#define TLS1_TXT_DH_RSA_WITH_AES_256_SHA "DH-RSA-AES256-SHA" +#define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA "DHE-DSS-AES256-SHA" +#define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA "DHE-RSA-AES256-SHA" +#define TLS1_TXT_ADH_WITH_AES_256_SHA "ADH-AES256-SHA" + +/* ECC ciphersuites from draft-ietf-tls-ecc-01.txt (Mar 15, 2001) */ +#define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA "ECDH-ECDSA-NULL-SHA" +#define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA "ECDH-ECDSA-RC4-SHA" +#define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA "ECDH-ECDSA-DES-CBC3-SHA" +#define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA "ECDH-ECDSA-AES128-SHA" +#define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA "ECDH-ECDSA-AES256-SHA" + +#define TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA "ECDHE-ECDSA-NULL-SHA" +#define TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA "ECDHE-ECDSA-RC4-SHA" +#define TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "ECDHE-ECDSA-DES-CBC3-SHA" +#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "ECDHE-ECDSA-AES128-SHA" +#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "ECDHE-ECDSA-AES256-SHA" + +#define TLS1_TXT_ECDH_RSA_WITH_NULL_SHA "ECDH-RSA-NULL-SHA" +#define TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA "ECDH-RSA-RC4-SHA" +#define TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA "ECDH-RSA-DES-CBC3-SHA" +#define TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA "ECDH-RSA-AES128-SHA" +#define TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA "ECDH-RSA-AES256-SHA" + +#define TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA "ECDHE-RSA-NULL-SHA" +#define TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA "ECDHE-RSA-RC4-SHA" +#define TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA "ECDHE-RSA-DES-CBC3-SHA" +#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA "ECDHE-RSA-AES128-SHA" +#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA "ECDHE-RSA-AES256-SHA" + +#define TLS1_TXT_ECDH_anon_WITH_NULL_SHA "AECDH-NULL-SHA" +#define TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA "AECDH-RC4-SHA" +#define TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA "AECDH-DES-CBC3-SHA" +#define TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA "AECDH-AES128-SHA" +#define TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA "AECDH-AES256-SHA" + +/* Camellia ciphersuites from RFC4132 */ +#define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA "CAMELLIA128-SHA" +#define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA "DH-DSS-CAMELLIA128-SHA" +#define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA "DH-RSA-CAMELLIA128-SHA" +#define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "DHE-DSS-CAMELLIA128-SHA" +#define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "DHE-RSA-CAMELLIA128-SHA" +#define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA "ADH-CAMELLIA128-SHA" + +#define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA "CAMELLIA256-SHA" +#define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA "DH-DSS-CAMELLIA256-SHA" +#define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA "DH-RSA-CAMELLIA256-SHA" +#define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "DHE-DSS-CAMELLIA256-SHA" +#define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "DHE-RSA-CAMELLIA256-SHA" +#define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA "ADH-CAMELLIA256-SHA" + +/* SEED ciphersuites from RFC4162 */ +#define TLS1_TXT_RSA_WITH_SEED_SHA "SEED-SHA" +#define TLS1_TXT_DH_DSS_WITH_SEED_SHA "DH-DSS-SEED-SHA" +#define TLS1_TXT_DH_RSA_WITH_SEED_SHA "DH-RSA-SEED-SHA" +#define TLS1_TXT_DHE_DSS_WITH_SEED_SHA "DHE-DSS-SEED-SHA" +#define TLS1_TXT_DHE_RSA_WITH_SEED_SHA "DHE-RSA-SEED-SHA" +#define TLS1_TXT_ADH_WITH_SEED_SHA "ADH-SEED-SHA" + +#define TLS_CT_RSA_SIGN 1 +#define TLS_CT_DSS_SIGN 2 +#define TLS_CT_RSA_FIXED_DH 3 +#define TLS_CT_DSS_FIXED_DH 4 +#define TLS_CT_ECDSA_SIGN 64 +#define TLS_CT_RSA_FIXED_ECDH 65 +#define TLS_CT_ECDSA_FIXED_ECDH 66 +#define TLS_CT_NUMBER 7 + +#define TLS1_FINISH_MAC_LENGTH 12 + +#define TLS_MD_MAX_CONST_SIZE 20 +#define TLS_MD_CLIENT_FINISH_CONST "client finished" +#define TLS_MD_CLIENT_FINISH_CONST_SIZE 15 +#define TLS_MD_SERVER_FINISH_CONST "server finished" +#define TLS_MD_SERVER_FINISH_CONST_SIZE 15 +#define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +#define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +#define TLS_MD_KEY_EXPANSION_CONST "key expansion" +#define TLS_MD_KEY_EXPANSION_CONST_SIZE 13 +#define TLS_MD_CLIENT_WRITE_KEY_CONST "client write key" +#define TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE 16 +#define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +#define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +#define TLS_MD_IV_BLOCK_CONST "IV block" +#define TLS_MD_IV_BLOCK_CONST_SIZE 8 +#define TLS_MD_MASTER_SECRET_CONST "master secret" +#define TLS_MD_MASTER_SECRET_CONST_SIZE 13 + +#ifdef CHARSET_EBCDIC +#undef TLS_MD_CLIENT_FINISH_CONST +#define TLS_MD_CLIENT_FINISH_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64" /*client finished*/ +#undef TLS_MD_SERVER_FINISH_CONST +#define TLS_MD_SERVER_FINISH_CONST "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64" /*server finished*/ +#undef TLS_MD_SERVER_WRITE_KEY_CONST +#define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" /*server write key*/ +#undef TLS_MD_KEY_EXPANSION_CONST +#define TLS_MD_KEY_EXPANSION_CONST "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e" /*key expansion*/ +#undef TLS_MD_CLIENT_WRITE_KEY_CONST +#define TLS_MD_CLIENT_WRITE_KEY_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" /*client write key*/ +#undef TLS_MD_SERVER_WRITE_KEY_CONST +#define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" /*server write key*/ +#undef TLS_MD_IV_BLOCK_CONST +#define TLS_MD_IV_BLOCK_CONST "\x49\x56\x20\x62\x6c\x6f\x63\x6b" /*IV block*/ +#undef TLS_MD_MASTER_SECRET_CONST +#define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" /*master secret*/ +#endif + +#ifdef __cplusplus +} +#endif +#endif + + + diff --git a/mswin32/OpenSSL/include/openssl/tmdiff.h b/mswin32/OpenSSL/include/openssl/tmdiff.h new file mode 100755 index 000000000..af5c41c64 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/tmdiff.h @@ -0,0 +1,93 @@ +/* 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 + */ +/* ... erm yeah, "dynamic hash tables" you say? + * + * And what would dynamic hash tables have to do with any of this code *now*? + * AFAICS, this code is only referenced by crypto/bn/exp.c which is an unused + * file that I doubt compiles any more. speed.c is the only thing that could + * use this (and it has nothing to do with hash tables), yet it instead has its + * own duplication of all this stuff and looks, if anything, more complete. See + * the corresponding note in apps/speed.c. + * The Bemused - Geoff + */ + +#ifndef HEADER_TMDIFF_H +#define HEADER_TMDIFF_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ms_tm MS_TM; + +MS_TM *ms_time_new(void ); +void ms_time_free(MS_TM *a); +void ms_time_get(MS_TM *a); +double ms_time_diff(MS_TM *start, MS_TM *end); +int ms_time_cmp(const MS_TM *ap, const MS_TM *bp); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/mswin32/OpenSSL/include/openssl/txt_db.h b/mswin32/OpenSSL/include/openssl/txt_db.h new file mode 100755 index 000000000..307e1ba23 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/txt_db.h @@ -0,0 +1,109 @@ +/* crypto/txt_db/txt_db.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.] + */ + +#ifndef HEADER_TXT_DB_H +#define HEADER_TXT_DB_H + +#include +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#include + +#define DB_ERROR_OK 0 +#define DB_ERROR_MALLOC 1 +#define DB_ERROR_INDEX_CLASH 2 +#define DB_ERROR_INDEX_OUT_OF_RANGE 3 +#define DB_ERROR_NO_INDEX 4 +#define DB_ERROR_INSERT_INDEX_CLASH 5 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct txt_db_st + { + int num_fields; + STACK /* char ** */ *data; + LHASH **index; + int (**qual)(char **); + long error; + long arg1; + long arg2; + char **arg_row; + } TXT_DB; + +#ifndef OPENSSL_NO_BIO +TXT_DB *TXT_DB_read(BIO *in, int num); +long TXT_DB_write(BIO *out, TXT_DB *db); +#else +TXT_DB *TXT_DB_read(char *in, int num); +long TXT_DB_write(char *out, TXT_DB *db); +#endif +int TXT_DB_create_index(TXT_DB *db,int field,int (*qual)(char **), + LHASH_HASH_FN_TYPE hash, LHASH_COMP_FN_TYPE cmp); +void TXT_DB_free(TXT_DB *db); +char **TXT_DB_get_by_index(TXT_DB *db, int idx, char **value); +int TXT_DB_insert(TXT_DB *db,char **value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mswin32/OpenSSL/include/openssl/ui.h b/mswin32/OpenSSL/include/openssl/ui.h new file mode 100755 index 000000000..018296412 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ui.h @@ -0,0 +1,381 @@ +/* crypto/ui/ui.h -*- mode:C; c-file-style: "eay" -*- */ +/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL + * project 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_H +#define HEADER_UI_H + +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct ui_st UI; */ +/* typedef struct ui_method_st UI_METHOD; */ + + +/* All the following functions return -1 or NULL on error and in some cases + (UI_process()) -2 if interrupted or in some other way cancelled. + When everything is fine, they return 0, a positive value or a non-NULL + pointer, all depending on their purpose. */ + +/* Creators and destructor. */ +UI *UI_new(void); +UI *UI_new_method(const UI_METHOD *method); +void UI_free(UI *ui); + +/* The following functions are used to add strings to be printed and prompt + strings to prompt for data. The names are UI_{add,dup}__string + and UI_{add,dup}_input_boolean. + + UI_{add,dup}__string have the following meanings: + add add a text or prompt string. The pointers given to these + functions are used verbatim, no copying is done. + dup make a copy of the text or prompt string, then add the copy + to the collection of strings in the user interface. + + The function is a name for the functionality that the given + string shall be used for. It can be one of: + input use the string as data prompt. + verify use the string as verification prompt. This + is used to verify a previous input. + info use the string for informational output. + error use the string for error output. + Honestly, there's currently no difference between info and error for the + moment. + + UI_{add,dup}_input_boolean have the same semantics for "add" and "dup", + and are typically used when one wants to prompt for a yes/no response. + + + All of the functions in this group take a UI and a prompt string. + The string input and verify addition functions also take a flag argument, + a buffer for the result to end up with, a minimum input size and a maximum + input size (the result buffer MUST be large enough to be able to contain + the maximum number of characters). Additionally, the verify addition + functions takes another buffer to compare the result against. + The boolean input functions take an action description string (which should + be safe to ignore if the expected user action is obvious, for example with + a dialog box with an OK button and a Cancel button), a string of acceptable + characters to mean OK and to mean Cancel. The two last strings are checked + to make sure they don't have common characters. Additionally, the same + flag argument as for the string input is taken, as well as a result buffer. + The result buffer is required to be at least one byte long. Depending on + the answer, the first character from the OK or the Cancel character strings + will be stored in the first byte of the result buffer. No NUL will be + added, so the result is *not* a string. + + On success, the all return an index of the added information. That index + is usefull when retrieving results with UI_get0_result(). */ +int UI_add_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_dup_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_add_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, const char *test_buf); +int UI_dup_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, const char *test_buf); +int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_add_info_string(UI *ui, const char *text); +int UI_dup_info_string(UI *ui, const char *text); +int UI_add_error_string(UI *ui, const char *text); +int UI_dup_error_string(UI *ui, const char *text); + +/* These are the possible flags. They can be or'ed together. */ +/* Use to have echoing of input */ +#define UI_INPUT_FLAG_ECHO 0x01 +/* Use a default password. Where that password is found is completely + up to the application, it might for example be in the user data set + with UI_add_user_data(). It is not recommended to have more than + one input in each UI being marked with this flag, or the application + might get confused. */ +#define UI_INPUT_FLAG_DEFAULT_PWD 0x02 + +/* The user of these routines may want to define flags of their own. The core + UI won't look at those, but will pass them on to the method routines. They + must use higher bits so they don't get confused with the UI bits above. + UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good + example of use is this: + + #define MY_UI_FLAG1 (0x01 << UI_INPUT_FLAG_USER_BASE) + +*/ +#define UI_INPUT_FLAG_USER_BASE 16 + + +/* The following function helps construct a prompt. object_desc is a + textual short description of the object, for example "pass phrase", + and object_name is the name of the object (might be a card name or + a file name. + The returned string shall always be allocated on the heap with + OPENSSL_malloc(), and need to be free'd with OPENSSL_free(). + + If the ui_method doesn't contain a pointer to a user-defined prompt + constructor, a default string is built, looking like this: + + "Enter {object_desc} for {object_name}:" + + So, if object_desc has the value "pass phrase" and object_name has + the value "foo.key", the resulting string is: + + "Enter pass phrase for foo.key:" +*/ +char *UI_construct_prompt(UI *ui_method, + const char *object_desc, const char *object_name); + + +/* The following function is used to store a pointer to user-specific data. + Any previous such pointer will be returned and replaced. + + For callback purposes, this function makes a lot more sense than using + ex_data, since the latter requires that different parts of OpenSSL or + applications share the same ex_data index. + + Note that the UI_OpenSSL() method completely ignores the user data. + Other methods may not, however. */ +void *UI_add_user_data(UI *ui, void *user_data); +/* We need a user data retrieving function as well. */ +void *UI_get0_user_data(UI *ui); + +/* Return the result associated with a prompt given with the index i. */ +const char *UI_get0_result(UI *ui, int i); + +/* When all strings have been added, process the whole thing. */ +int UI_process(UI *ui); + +/* Give a user interface parametrised control commands. This can be used to + send down an integer, a data pointer or a function pointer, as well as + be used to get information from a UI. */ +int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f)(void)); + +/* The commands */ +/* Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the + OpenSSL error stack before printing any info or added error messages and + before any prompting. */ +#define UI_CTRL_PRINT_ERRORS 1 +/* Check if a UI_process() is possible to do again with the same instance of + a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0 + if not. */ +#define UI_CTRL_IS_REDOABLE 2 + + +/* Some methods may use extra data */ +#define UI_set_app_data(s,arg) UI_set_ex_data(s,0,arg) +#define UI_get_app_data(s) UI_get_ex_data(s,0) +int UI_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int UI_set_ex_data(UI *r,int idx,void *arg); +void *UI_get_ex_data(UI *r, int idx); + +/* Use specific methods instead of the built-in one */ +void UI_set_default_method(const UI_METHOD *meth); +const UI_METHOD *UI_get_default_method(void); +const UI_METHOD *UI_get_method(UI *ui); +const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth); + +/* The method with all the built-in thingies */ +UI_METHOD *UI_OpenSSL(void); + + +/* ---------- For method writers ---------- */ +/* A method contains a number of functions that implement the low level + of the User Interface. The functions are: + + an opener This function starts a session, maybe by opening + a channel to a tty, or by opening a window. + a writer This function is called to write a given string, + maybe to the tty, maybe as a field label in a + window. + a flusher This function is called to flush everything that + has been output so far. It can be used to actually + display a dialog box after it has been built. + a reader This function is called to read a given prompt, + maybe from the tty, maybe from a field in a + window. Note that it's called wth all string + structures, not only the prompt ones, so it must + check such things itself. + a closer This function closes the session, maybe by closing + the channel to the tty, or closing the window. + + All these functions are expected to return: + + 0 on error. + 1 on success. + -1 on out-of-band events, for example if some prompting has + been canceled (by pressing Ctrl-C, for example). This is + only checked when returned by the flusher or the reader. + + The way this is used, the opener is first called, then the writer for all + strings, then the flusher, then the reader for all strings and finally the + closer. Note that if you want to prompt from a terminal or other command + line interface, the best is to have the reader also write the prompts + instead of having the writer do it. If you want to prompt from a dialog + box, the writer can be used to build up the contents of the box, and the + flusher to actually display the box and run the event loop until all data + has been given, after which the reader only grabs the given data and puts + them back into the UI strings. + + All method functions take a UI as argument. Additionally, the writer and + the reader take a UI_STRING. +*/ + +/* The UI_STRING type is the data structure that contains all the needed info + about a string or a prompt, including test data for a verification prompt. +*/ +DECLARE_STACK_OF(UI_STRING) +typedef struct ui_string_st UI_STRING; + +/* The different types of strings that are currently supported. + This is only needed by method authors. */ +enum UI_string_types + { + UIT_NONE=0, + UIT_PROMPT, /* Prompt for a string */ + UIT_VERIFY, /* Prompt for a string and verify */ + UIT_BOOLEAN, /* Prompt for a yes/no response */ + UIT_INFO, /* Send info to the user */ + UIT_ERROR /* Send an error message to the user */ + }; + +/* Create and manipulate methods */ +UI_METHOD *UI_create_method(char *name); +void UI_destroy_method(UI_METHOD *ui_method); +int UI_method_set_opener(UI_METHOD *method, int (*opener)(UI *ui)); +int UI_method_set_writer(UI_METHOD *method, int (*writer)(UI *ui, UI_STRING *uis)); +int UI_method_set_flusher(UI_METHOD *method, int (*flusher)(UI *ui)); +int UI_method_set_reader(UI_METHOD *method, int (*reader)(UI *ui, UI_STRING *uis)); +int UI_method_set_closer(UI_METHOD *method, int (*closer)(UI *ui)); +int (*UI_method_get_opener(UI_METHOD *method))(UI*); +int (*UI_method_get_writer(UI_METHOD *method))(UI*,UI_STRING*); +int (*UI_method_get_flusher(UI_METHOD *method))(UI*); +int (*UI_method_get_reader(UI_METHOD *method))(UI*,UI_STRING*); +int (*UI_method_get_closer(UI_METHOD *method))(UI*); + +/* The following functions are helpers for method writers to access relevant + data from a UI_STRING. */ + +/* Return type of the UI_STRING */ +enum UI_string_types UI_get_string_type(UI_STRING *uis); +/* Return input flags of the UI_STRING */ +int UI_get_input_flags(UI_STRING *uis); +/* Return the actual string to output (the prompt, info or error) */ +const char *UI_get0_output_string(UI_STRING *uis); +/* Return the optional action string to output (the boolean promtp instruction) */ +const char *UI_get0_action_string(UI_STRING *uis); +/* Return the result of a prompt */ +const char *UI_get0_result_string(UI_STRING *uis); +/* Return the string to test the result against. Only useful with verifies. */ +const char *UI_get0_test_string(UI_STRING *uis); +/* Return the required minimum size of the result */ +int UI_get_result_minsize(UI_STRING *uis); +/* Return the required maximum size of the result */ +int UI_get_result_maxsize(UI_STRING *uis); +/* Set the result of a UI_STRING. */ +int UI_set_result(UI *ui, UI_STRING *uis, const char *result); + + +/* A couple of popular utility functions */ +int UI_UTIL_read_pw_string(char *buf,int length,const char *prompt,int verify); +int UI_UTIL_read_pw(char *buf,char *buff,int size,const char *prompt,int verify); + + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_UI_strings(void); + +/* Error codes for the UI functions. */ + +/* Function codes. */ +#define UI_F_GENERAL_ALLOCATE_BOOLEAN 108 +#define UI_F_GENERAL_ALLOCATE_PROMPT 109 +#define UI_F_GENERAL_ALLOCATE_STRING 100 +#define UI_F_UI_CTRL 111 +#define UI_F_UI_DUP_ERROR_STRING 101 +#define UI_F_UI_DUP_INFO_STRING 102 +#define UI_F_UI_DUP_INPUT_BOOLEAN 110 +#define UI_F_UI_DUP_INPUT_STRING 103 +#define UI_F_UI_DUP_VERIFY_STRING 106 +#define UI_F_UI_GET0_RESULT 107 +#define UI_F_UI_NEW_METHOD 104 +#define UI_F_UI_SET_RESULT 105 + +/* Reason codes. */ +#define UI_R_COMMON_OK_AND_CANCEL_CHARACTERS 104 +#define UI_R_INDEX_TOO_LARGE 102 +#define UI_R_INDEX_TOO_SMALL 103 +#define UI_R_NO_RESULT_BUFFER 105 +#define UI_R_RESULT_TOO_LARGE 100 +#define UI_R_RESULT_TOO_SMALL 101 +#define UI_R_UNKNOWN_CONTROL_COMMAND 106 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/ui_compat.h b/mswin32/OpenSSL/include/openssl/ui_compat.h new file mode 100755 index 000000000..b35c9bb7f --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/ui_compat.h @@ -0,0 +1,83 @@ +/* crypto/ui/ui.h -*- mode:C; c-file-style: "eay" -*- */ +/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL + * project 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_COMPAT_H +#define HEADER_UI_COMPAT_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* The following functions were previously part of the DES section, + and are provided here for backward compatibility reasons. */ + +#define des_read_pw_string(b,l,p,v) \ + _ossl_old_des_read_pw_string((b),(l),(p),(v)) +#define des_read_pw(b,bf,s,p,v) \ + _ossl_old_des_read_pw((b),(bf),(s),(p),(v)) + +int _ossl_old_des_read_pw_string(char *buf,int length,const char *prompt,int verify); +int _ossl_old_des_read_pw(char *buf,char *buff,int size,const char *prompt,int verify); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/x509.h b/mswin32/OpenSSL/include/openssl/x509.h new file mode 100755 index 000000000..16a954f70 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/x509.h @@ -0,0 +1,1344 @@ +/* crypto/x509/x509.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.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_X509_H +#define HEADER_X509_H + +#include +#include +#ifndef OPENSSL_NO_BUFFER +#include +#endif +#ifndef OPENSSL_NO_EVP +#include +#endif +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#include +#include + +#ifndef OPENSSL_NO_EC +#include +#endif + +#ifndef OPENSSL_NO_ECDSA +#include +#endif + +#ifndef OPENSSL_NO_ECDH +#include +#endif + +#ifndef OPENSSL_NO_DEPRECATED +#ifndef OPENSSL_NO_RSA +#include +#endif +#ifndef OPENSSL_NO_DSA +#include +#endif +#ifndef OPENSSL_NO_DH +#include +#endif +#endif + +#ifndef OPENSSL_NO_SHA +#include +#endif +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_SYS_WIN32 +/* Under Win32 these are defined in wincrypt.h */ +#undef X509_NAME +#undef X509_CERT_PAIR +#endif + +#define X509_FILETYPE_PEM 1 +#define X509_FILETYPE_ASN1 2 +#define X509_FILETYPE_DEFAULT 3 + +#define X509v3_KU_DIGITAL_SIGNATURE 0x0080 +#define X509v3_KU_NON_REPUDIATION 0x0040 +#define X509v3_KU_KEY_ENCIPHERMENT 0x0020 +#define X509v3_KU_DATA_ENCIPHERMENT 0x0010 +#define X509v3_KU_KEY_AGREEMENT 0x0008 +#define X509v3_KU_KEY_CERT_SIGN 0x0004 +#define X509v3_KU_CRL_SIGN 0x0002 +#define X509v3_KU_ENCIPHER_ONLY 0x0001 +#define X509v3_KU_DECIPHER_ONLY 0x8000 +#define X509v3_KU_UNDEF 0xffff + +typedef struct X509_objects_st + { + int nid; + int (*a2i)(void); + int (*i2a)(void); + } X509_OBJECTS; + +struct X509_algor_st + { + ASN1_OBJECT *algorithm; + ASN1_TYPE *parameter; + } /* X509_ALGOR */; + +DECLARE_STACK_OF(X509_ALGOR) +DECLARE_ASN1_SET_OF(X509_ALGOR) + +typedef struct X509_val_st + { + ASN1_TIME *notBefore; + ASN1_TIME *notAfter; + } X509_VAL; + +typedef struct X509_pubkey_st + { + X509_ALGOR *algor; + ASN1_BIT_STRING *public_key; + EVP_PKEY *pkey; + } X509_PUBKEY; + +typedef struct X509_sig_st + { + X509_ALGOR *algor; + ASN1_OCTET_STRING *digest; + } X509_SIG; + +typedef struct X509_name_entry_st + { + ASN1_OBJECT *object; + ASN1_STRING *value; + int set; + int size; /* temp variable */ + } X509_NAME_ENTRY; + +DECLARE_STACK_OF(X509_NAME_ENTRY) +DECLARE_ASN1_SET_OF(X509_NAME_ENTRY) + +/* we always keep X509_NAMEs in 2 forms. */ +struct X509_name_st + { + STACK_OF(X509_NAME_ENTRY) *entries; + int modified; /* true if 'bytes' needs to be built */ +#ifndef OPENSSL_NO_BUFFER + BUF_MEM *bytes; +#else + char *bytes; +#endif + unsigned long hash; /* Keep the hash around for lookups */ + } /* X509_NAME */; + +DECLARE_STACK_OF(X509_NAME) + +#define X509_EX_V_NETSCAPE_HACK 0x8000 +#define X509_EX_V_INIT 0x0001 +typedef struct X509_extension_st + { + ASN1_OBJECT *object; + ASN1_BOOLEAN critical; + ASN1_OCTET_STRING *value; + } X509_EXTENSION; + +DECLARE_STACK_OF(X509_EXTENSION) +DECLARE_ASN1_SET_OF(X509_EXTENSION) + +/* a sequence of these are used */ +typedef struct x509_attributes_st + { + ASN1_OBJECT *object; + int single; /* 0 for a set, 1 for a single item (which is wrong) */ + union { + char *ptr; +/* 0 */ STACK_OF(ASN1_TYPE) *set; +/* 1 */ ASN1_TYPE *single; + } value; + } X509_ATTRIBUTE; + +DECLARE_STACK_OF(X509_ATTRIBUTE) +DECLARE_ASN1_SET_OF(X509_ATTRIBUTE) + + +typedef struct X509_req_info_st + { + ASN1_ENCODING enc; + ASN1_INTEGER *version; + X509_NAME *subject; + X509_PUBKEY *pubkey; + /* d=2 hl=2 l= 0 cons: cont: 00 */ + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ + } X509_REQ_INFO; + +typedef struct X509_req_st + { + X509_REQ_INFO *req_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; + } X509_REQ; + +typedef struct x509_cinf_st + { + ASN1_INTEGER *version; /* [ 0 ] default of v1 */ + ASN1_INTEGER *serialNumber; + X509_ALGOR *signature; + X509_NAME *issuer; + X509_VAL *validity; + X509_NAME *subject; + X509_PUBKEY *key; + ASN1_BIT_STRING *issuerUID; /* [ 1 ] optional in v2 */ + ASN1_BIT_STRING *subjectUID; /* [ 2 ] optional in v2 */ + STACK_OF(X509_EXTENSION) *extensions; /* [ 3 ] optional in v3 */ + } X509_CINF; + +/* This stuff is certificate "auxiliary info" + * it contains details which are useful in certificate + * stores and databases. When used this is tagged onto + * the end of the certificate itself + */ + +typedef struct x509_cert_aux_st + { + STACK_OF(ASN1_OBJECT) *trust; /* trusted uses */ + STACK_OF(ASN1_OBJECT) *reject; /* rejected uses */ + ASN1_UTF8STRING *alias; /* "friendly name" */ + ASN1_OCTET_STRING *keyid; /* key id of private key */ + STACK_OF(X509_ALGOR) *other; /* other unspecified info */ + } X509_CERT_AUX; + +struct x509_st + { + X509_CINF *cert_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int valid; + int references; + char *name; + CRYPTO_EX_DATA ex_data; + /* These contain copies of various extension values */ + long ex_pathlen; + long ex_pcpathlen; + unsigned long ex_flags; + unsigned long ex_kusage; + unsigned long ex_xkusage; + unsigned long ex_nscert; + ASN1_OCTET_STRING *skid; + struct AUTHORITY_KEYID_st *akid; + X509_POLICY_CACHE *policy_cache; +#ifndef OPENSSL_NO_RFC3779 + STACK_OF(IPAddressFamily) *rfc3779_addr; + struct ASIdentifiers_st *rfc3779_asid; +#endif +#ifndef OPENSSL_NO_SHA + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; +#endif + X509_CERT_AUX *aux; + } /* X509 */; + +DECLARE_STACK_OF(X509) +DECLARE_ASN1_SET_OF(X509) + +/* This is used for a table of trust checking functions */ + +typedef struct x509_trust_st { + int trust; + int flags; + int (*check_trust)(struct x509_trust_st *, X509 *, int); + char *name; + int arg1; + void *arg2; +} X509_TRUST; + +DECLARE_STACK_OF(X509_TRUST) + +typedef struct x509_cert_pair_st { + X509 *forward; + X509 *reverse; +} X509_CERT_PAIR; + +/* standard trust ids */ + +#define X509_TRUST_DEFAULT -1 /* Only valid in purpose settings */ + +#define X509_TRUST_COMPAT 1 +#define X509_TRUST_SSL_CLIENT 2 +#define X509_TRUST_SSL_SERVER 3 +#define X509_TRUST_EMAIL 4 +#define X509_TRUST_OBJECT_SIGN 5 +#define X509_TRUST_OCSP_SIGN 6 +#define X509_TRUST_OCSP_REQUEST 7 + +/* Keep these up to date! */ +#define X509_TRUST_MIN 1 +#define X509_TRUST_MAX 7 + + +/* trust_flags values */ +#define X509_TRUST_DYNAMIC 1 +#define X509_TRUST_DYNAMIC_NAME 2 + +/* check_trust return codes */ + +#define X509_TRUST_TRUSTED 1 +#define X509_TRUST_REJECTED 2 +#define X509_TRUST_UNTRUSTED 3 + +/* Flags for X509_print_ex() */ + +#define X509_FLAG_COMPAT 0 +#define X509_FLAG_NO_HEADER 1L +#define X509_FLAG_NO_VERSION (1L << 1) +#define X509_FLAG_NO_SERIAL (1L << 2) +#define X509_FLAG_NO_SIGNAME (1L << 3) +#define X509_FLAG_NO_ISSUER (1L << 4) +#define X509_FLAG_NO_VALIDITY (1L << 5) +#define X509_FLAG_NO_SUBJECT (1L << 6) +#define X509_FLAG_NO_PUBKEY (1L << 7) +#define X509_FLAG_NO_EXTENSIONS (1L << 8) +#define X509_FLAG_NO_SIGDUMP (1L << 9) +#define X509_FLAG_NO_AUX (1L << 10) +#define X509_FLAG_NO_ATTRIBUTES (1L << 11) + +/* Flags specific to X509_NAME_print_ex() */ + +/* The field separator information */ + +#define XN_FLAG_SEP_MASK (0xf << 16) + +#define XN_FLAG_COMPAT 0 /* Traditional SSLeay: use old X509_NAME_print */ +#define XN_FLAG_SEP_COMMA_PLUS (1 << 16) /* RFC2253 ,+ */ +#define XN_FLAG_SEP_CPLUS_SPC (2 << 16) /* ,+ spaced: more readable */ +#define XN_FLAG_SEP_SPLUS_SPC (3 << 16) /* ;+ spaced */ +#define XN_FLAG_SEP_MULTILINE (4 << 16) /* One line per field */ + +#define XN_FLAG_DN_REV (1 << 20) /* Reverse DN order */ + +/* How the field name is shown */ + +#define XN_FLAG_FN_MASK (0x3 << 21) + +#define XN_FLAG_FN_SN 0 /* Object short name */ +#define XN_FLAG_FN_LN (1 << 21) /* Object long name */ +#define XN_FLAG_FN_OID (2 << 21) /* Always use OIDs */ +#define XN_FLAG_FN_NONE (3 << 21) /* No field names */ + +#define XN_FLAG_SPC_EQ (1 << 23) /* Put spaces round '=' */ + +/* This determines if we dump fields we don't recognise: + * RFC2253 requires this. + */ + +#define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) + +#define XN_FLAG_FN_ALIGN (1 << 25) /* Align field names to 20 characters */ + +/* Complete set of RFC2253 flags */ + +#define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | \ + XN_FLAG_SEP_COMMA_PLUS | \ + XN_FLAG_DN_REV | \ + XN_FLAG_FN_SN | \ + XN_FLAG_DUMP_UNKNOWN_FIELDS) + +/* readable oneline form */ + +#define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | \ + ASN1_STRFLGS_ESC_QUOTE | \ + XN_FLAG_SEP_CPLUS_SPC | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_SN) + +/* readable multiline form */ + +#define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + XN_FLAG_SEP_MULTILINE | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_LN | \ + XN_FLAG_FN_ALIGN) + +typedef struct X509_revoked_st + { + ASN1_INTEGER *serialNumber; + ASN1_TIME *revocationDate; + STACK_OF(X509_EXTENSION) /* optional */ *extensions; + int sequence; /* load sequence */ + } X509_REVOKED; + +DECLARE_STACK_OF(X509_REVOKED) +DECLARE_ASN1_SET_OF(X509_REVOKED) + +typedef struct X509_crl_info_st + { + ASN1_INTEGER *version; + X509_ALGOR *sig_alg; + X509_NAME *issuer; + ASN1_TIME *lastUpdate; + ASN1_TIME *nextUpdate; + STACK_OF(X509_REVOKED) *revoked; + STACK_OF(X509_EXTENSION) /* [0] */ *extensions; + ASN1_ENCODING enc; + } X509_CRL_INFO; + +struct X509_crl_st + { + /* actual signature */ + X509_CRL_INFO *crl; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; + } /* X509_CRL */; + +DECLARE_STACK_OF(X509_CRL) +DECLARE_ASN1_SET_OF(X509_CRL) + +typedef struct private_key_st + { + int version; + /* The PKCS#8 data types */ + X509_ALGOR *enc_algor; + ASN1_OCTET_STRING *enc_pkey; /* encrypted pub key */ + + /* When decrypted, the following will not be NULL */ + EVP_PKEY *dec_pkey; + + /* used to encrypt and decrypt */ + int key_length; + char *key_data; + int key_free; /* true if we should auto free key_data */ + + /* expanded version of 'enc_algor' */ + EVP_CIPHER_INFO cipher; + + int references; + } X509_PKEY; + +#ifndef OPENSSL_NO_EVP +typedef struct X509_info_st + { + X509 *x509; + X509_CRL *crl; + X509_PKEY *x_pkey; + + EVP_CIPHER_INFO enc_cipher; + int enc_len; + char *enc_data; + + int references; + } X509_INFO; + +DECLARE_STACK_OF(X509_INFO) +#endif + +/* The next 2 structures and their 8 routines were sent to me by + * Pat Richard and are used to manipulate + * Netscapes spki structures - useful if you are writing a CA web page + */ +typedef struct Netscape_spkac_st + { + X509_PUBKEY *pubkey; + ASN1_IA5STRING *challenge; /* challenge sent in atlas >= PR2 */ + } NETSCAPE_SPKAC; + +typedef struct Netscape_spki_st + { + NETSCAPE_SPKAC *spkac; /* signed public key and challenge */ + X509_ALGOR *sig_algor; + ASN1_BIT_STRING *signature; + } NETSCAPE_SPKI; + +/* Netscape certificate sequence structure */ +typedef struct Netscape_certificate_sequence + { + ASN1_OBJECT *type; + STACK_OF(X509) *certs; + } NETSCAPE_CERT_SEQUENCE; + +/* Unused (and iv length is wrong) +typedef struct CBCParameter_st + { + unsigned char iv[8]; + } CBC_PARAM; +*/ + +/* Password based encryption structure */ + +typedef struct PBEPARAM_st { +ASN1_OCTET_STRING *salt; +ASN1_INTEGER *iter; +} PBEPARAM; + +/* Password based encryption V2 structures */ + +typedef struct PBE2PARAM_st { +X509_ALGOR *keyfunc; +X509_ALGOR *encryption; +} PBE2PARAM; + +typedef struct PBKDF2PARAM_st { +ASN1_TYPE *salt; /* Usually OCTET STRING but could be anything */ +ASN1_INTEGER *iter; +ASN1_INTEGER *keylength; +X509_ALGOR *prf; +} PBKDF2PARAM; + + +/* PKCS#8 private key info structure */ + +typedef struct pkcs8_priv_key_info_st + { + int broken; /* Flag for various broken formats */ +#define PKCS8_OK 0 +#define PKCS8_NO_OCTET 1 +#define PKCS8_EMBEDDED_PARAM 2 +#define PKCS8_NS_DB 3 + ASN1_INTEGER *version; + X509_ALGOR *pkeyalg; + ASN1_TYPE *pkey; /* Should be OCTET STRING but some are broken */ + STACK_OF(X509_ATTRIBUTE) *attributes; + } PKCS8_PRIV_KEY_INFO; + +#ifdef __cplusplus +} +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef SSLEAY_MACROS +#define X509_verify(a,r) ASN1_verify((int (*)())i2d_X509_CINF,a->sig_alg,\ + a->signature,(char *)a->cert_info,r) +#define X509_REQ_verify(a,r) ASN1_verify((int (*)())i2d_X509_REQ_INFO, \ + a->sig_alg,a->signature,(char *)a->req_info,r) +#define X509_CRL_verify(a,r) ASN1_verify((int (*)())i2d_X509_CRL_INFO, \ + a->sig_alg, a->signature,(char *)a->crl,r) + +#define X509_sign(x,pkey,md) \ + ASN1_sign((int (*)())i2d_X509_CINF, x->cert_info->signature, \ + x->sig_alg, x->signature, (char *)x->cert_info,pkey,md) +#define X509_REQ_sign(x,pkey,md) \ + ASN1_sign((int (*)())i2d_X509_REQ_INFO,x->sig_alg, NULL, \ + x->signature, (char *)x->req_info,pkey,md) +#define X509_CRL_sign(x,pkey,md) \ + ASN1_sign((int (*)())i2d_X509_CRL_INFO,x->crl->sig_alg,x->sig_alg, \ + x->signature, (char *)x->crl,pkey,md) +#define NETSCAPE_SPKI_sign(x,pkey,md) \ + ASN1_sign((int (*)())i2d_NETSCAPE_SPKAC, x->sig_algor,NULL, \ + x->signature, (char *)x->spkac,pkey,md) + +#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) +#define d2i_X509_fp(fp,x509) (X509 *)ASN1_d2i_fp((char *(*)())X509_new, \ + (char *(*)())d2i_X509, (fp),(unsigned char **)(x509)) +#define i2d_X509_fp(fp,x509) ASN1_i2d_fp(i2d_X509,fp,(unsigned char *)x509) +#define d2i_X509_bio(bp,x509) (X509 *)ASN1_d2i_bio((char *(*)())X509_new, \ + (char *(*)())d2i_X509, (bp),(unsigned char **)(x509)) +#define i2d_X509_bio(bp,x509) ASN1_i2d_bio(i2d_X509,bp,(unsigned char *)x509) + +#define X509_CRL_dup(crl) (X509_CRL *)ASN1_dup((int (*)())i2d_X509_CRL, \ + (char *(*)())d2i_X509_CRL,(char *)crl) +#define d2i_X509_CRL_fp(fp,crl) (X509_CRL *)ASN1_d2i_fp((char *(*)()) \ + X509_CRL_new,(char *(*)())d2i_X509_CRL, (fp),\ + (unsigned char **)(crl)) +#define i2d_X509_CRL_fp(fp,crl) ASN1_i2d_fp(i2d_X509_CRL,fp,\ + (unsigned char *)crl) +#define d2i_X509_CRL_bio(bp,crl) (X509_CRL *)ASN1_d2i_bio((char *(*)()) \ + X509_CRL_new,(char *(*)())d2i_X509_CRL, (bp),\ + (unsigned char **)(crl)) +#define i2d_X509_CRL_bio(bp,crl) ASN1_i2d_bio(i2d_X509_CRL,bp,\ + (unsigned char *)crl) + +#define PKCS7_dup(p7) (PKCS7 *)ASN1_dup((int (*)())i2d_PKCS7, \ + (char *(*)())d2i_PKCS7,(char *)p7) +#define d2i_PKCS7_fp(fp,p7) (PKCS7 *)ASN1_d2i_fp((char *(*)()) \ + PKCS7_new,(char *(*)())d2i_PKCS7, (fp),\ + (unsigned char **)(p7)) +#define i2d_PKCS7_fp(fp,p7) ASN1_i2d_fp(i2d_PKCS7,fp,\ + (unsigned char *)p7) +#define d2i_PKCS7_bio(bp,p7) (PKCS7 *)ASN1_d2i_bio((char *(*)()) \ + PKCS7_new,(char *(*)())d2i_PKCS7, (bp),\ + (unsigned char **)(p7)) +#define i2d_PKCS7_bio(bp,p7) ASN1_i2d_bio(i2d_PKCS7,bp,\ + (unsigned char *)p7) + +#define X509_REQ_dup(req) (X509_REQ *)ASN1_dup((int (*)())i2d_X509_REQ, \ + (char *(*)())d2i_X509_REQ,(char *)req) +#define d2i_X509_REQ_fp(fp,req) (X509_REQ *)ASN1_d2i_fp((char *(*)())\ + X509_REQ_new, (char *(*)())d2i_X509_REQ, (fp),\ + (unsigned char **)(req)) +#define i2d_X509_REQ_fp(fp,req) ASN1_i2d_fp(i2d_X509_REQ,fp,\ + (unsigned char *)req) +#define d2i_X509_REQ_bio(bp,req) (X509_REQ *)ASN1_d2i_bio((char *(*)())\ + X509_REQ_new, (char *(*)())d2i_X509_REQ, (bp),\ + (unsigned char **)(req)) +#define i2d_X509_REQ_bio(bp,req) ASN1_i2d_bio(i2d_X509_REQ,bp,\ + (unsigned char *)req) + +#define RSAPublicKey_dup(rsa) (RSA *)ASN1_dup((int (*)())i2d_RSAPublicKey, \ + (char *(*)())d2i_RSAPublicKey,(char *)rsa) +#define RSAPrivateKey_dup(rsa) (RSA *)ASN1_dup((int (*)())i2d_RSAPrivateKey, \ + (char *(*)())d2i_RSAPrivateKey,(char *)rsa) + +#define d2i_RSAPrivateKey_fp(fp,rsa) (RSA *)ASN1_d2i_fp((char *(*)())\ + RSA_new,(char *(*)())d2i_RSAPrivateKey, (fp), \ + (unsigned char **)(rsa)) +#define i2d_RSAPrivateKey_fp(fp,rsa) ASN1_i2d_fp(i2d_RSAPrivateKey,fp, \ + (unsigned char *)rsa) +#define d2i_RSAPrivateKey_bio(bp,rsa) (RSA *)ASN1_d2i_bio((char *(*)())\ + RSA_new,(char *(*)())d2i_RSAPrivateKey, (bp), \ + (unsigned char **)(rsa)) +#define i2d_RSAPrivateKey_bio(bp,rsa) ASN1_i2d_bio(i2d_RSAPrivateKey,bp, \ + (unsigned char *)rsa) + +#define d2i_RSAPublicKey_fp(fp,rsa) (RSA *)ASN1_d2i_fp((char *(*)())\ + RSA_new,(char *(*)())d2i_RSAPublicKey, (fp), \ + (unsigned char **)(rsa)) +#define i2d_RSAPublicKey_fp(fp,rsa) ASN1_i2d_fp(i2d_RSAPublicKey,fp, \ + (unsigned char *)rsa) +#define d2i_RSAPublicKey_bio(bp,rsa) (RSA *)ASN1_d2i_bio((char *(*)())\ + RSA_new,(char *(*)())d2i_RSAPublicKey, (bp), \ + (unsigned char **)(rsa)) +#define i2d_RSAPublicKey_bio(bp,rsa) ASN1_i2d_bio(i2d_RSAPublicKey,bp, \ + (unsigned char *)rsa) + +#define d2i_DSAPrivateKey_fp(fp,dsa) (DSA *)ASN1_d2i_fp((char *(*)())\ + DSA_new,(char *(*)())d2i_DSAPrivateKey, (fp), \ + (unsigned char **)(dsa)) +#define i2d_DSAPrivateKey_fp(fp,dsa) ASN1_i2d_fp(i2d_DSAPrivateKey,fp, \ + (unsigned char *)dsa) +#define d2i_DSAPrivateKey_bio(bp,dsa) (DSA *)ASN1_d2i_bio((char *(*)())\ + DSA_new,(char *(*)())d2i_DSAPrivateKey, (bp), \ + (unsigned char **)(dsa)) +#define i2d_DSAPrivateKey_bio(bp,dsa) ASN1_i2d_bio(i2d_DSAPrivateKey,bp, \ + (unsigned char *)dsa) + +#define d2i_ECPrivateKey_fp(fp,ecdsa) (EC_KEY *)ASN1_d2i_fp((char *(*)())\ + EC_KEY_new,(char *(*)())d2i_ECPrivateKey, (fp), \ + (unsigned char **)(ecdsa)) +#define i2d_ECPrivateKey_fp(fp,ecdsa) ASN1_i2d_fp(i2d_ECPrivateKey,fp, \ + (unsigned char *)ecdsa) +#define d2i_ECPrivateKey_bio(bp,ecdsa) (EC_KEY *)ASN1_d2i_bio((char *(*)())\ + EC_KEY_new,(char *(*)())d2i_ECPrivateKey, (bp), \ + (unsigned char **)(ecdsa)) +#define i2d_ECPrivateKey_bio(bp,ecdsa) ASN1_i2d_bio(i2d_ECPrivateKey,bp, \ + (unsigned char *)ecdsa) + +#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( \ + (int (*)())i2d_X509_NAME_ENTRY, \ + (char *(*)())d2i_X509_NAME_ENTRY,\ + (char *)ne) + +#define X509_digest(data,type,md,len) \ + 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 + +#define X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version) +/* #define X509_get_serialNumber(x) ((x)->cert_info->serialNumber) */ +#define X509_get_notBefore(x) ((x)->cert_info->validity->notBefore) +#define X509_get_notAfter(x) ((x)->cert_info->validity->notAfter) +#define X509_extract_key(x) X509_get_pubkey(x) /*****/ +#define X509_REQ_get_version(x) ASN1_INTEGER_get((x)->req_info->version) +#define X509_REQ_get_subject_name(x) ((x)->req_info->subject) +#define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) +#define X509_name_cmp(a,b) X509_NAME_cmp((a),(b)) +#define X509_get_signature_type(x) EVP_PKEY_type(OBJ_obj2nid((x)->sig_alg->algorithm)) + +#define X509_CRL_get_version(x) ASN1_INTEGER_get((x)->crl->version) +#define X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate) +#define X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate) +#define X509_CRL_get_issuer(x) ((x)->crl->issuer) +#define X509_CRL_get_REVOKED(x) ((x)->crl->revoked) + +/* This one is only used so that a binary form can output, as in + * i2d_X509_NAME(X509_get_X509_PUBKEY(x),&buf) */ +#define X509_get_X509_PUBKEY(x) ((x)->cert_info->key) + + +const char *X509_verify_cert_error_string(long n); + +#ifndef SSLEAY_MACROS +#ifndef OPENSSL_NO_EVP +int X509_verify(X509 *a, EVP_PKEY *r); + +int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r); +int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r); +int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r); + +NETSCAPE_SPKI * NETSCAPE_SPKI_b64_decode(const char *str, int len); +char * NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x); +EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x); +int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey); + +int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki); + +int X509_signature_print(BIO *bp,X509_ALGOR *alg, ASN1_STRING *sig); + +int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md); +int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md); + +int X509_pubkey_digest(const X509 *data,const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_digest(const X509 *data,const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_CRL_digest(const X509_CRL *data,const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_REQ_digest(const X509_REQ *data,const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_NAME_digest(const X509_NAME *data,const EVP_MD *type, + unsigned char *md, unsigned int *len); +#endif + +#ifndef OPENSSL_NO_FP_API +X509 *d2i_X509_fp(FILE *fp, X509 **x509); +int i2d_X509_fp(FILE *fp,X509 *x509); +X509_CRL *d2i_X509_CRL_fp(FILE *fp,X509_CRL **crl); +int i2d_X509_CRL_fp(FILE *fp,X509_CRL *crl); +X509_REQ *d2i_X509_REQ_fp(FILE *fp,X509_REQ **req); +int i2d_X509_REQ_fp(FILE *fp,X509_REQ *req); +#ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_fp(FILE *fp,RSA **rsa); +int i2d_RSAPrivateKey_fp(FILE *fp,RSA *rsa); +RSA *d2i_RSAPublicKey_fp(FILE *fp,RSA **rsa); +int i2d_RSAPublicKey_fp(FILE *fp,RSA *rsa); +RSA *d2i_RSA_PUBKEY_fp(FILE *fp,RSA **rsa); +int i2d_RSA_PUBKEY_fp(FILE *fp,RSA *rsa); +#endif +#ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); +int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa); +DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); +int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa); +#endif +#ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); +int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); +int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey); +#endif +X509_SIG *d2i_PKCS8_fp(FILE *fp,X509_SIG **p8); +int i2d_PKCS8_fp(FILE *fp,X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key); +int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); +int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); +#endif + +#ifndef OPENSSL_NO_BIO +X509 *d2i_X509_bio(BIO *bp,X509 **x509); +int i2d_X509_bio(BIO *bp,X509 *x509); +X509_CRL *d2i_X509_CRL_bio(BIO *bp,X509_CRL **crl); +int i2d_X509_CRL_bio(BIO *bp,X509_CRL *crl); +X509_REQ *d2i_X509_REQ_bio(BIO *bp,X509_REQ **req); +int i2d_X509_REQ_bio(BIO *bp,X509_REQ *req); +#ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_bio(BIO *bp,RSA **rsa); +int i2d_RSAPrivateKey_bio(BIO *bp,RSA *rsa); +RSA *d2i_RSAPublicKey_bio(BIO *bp,RSA **rsa); +int i2d_RSAPublicKey_bio(BIO *bp,RSA *rsa); +RSA *d2i_RSA_PUBKEY_bio(BIO *bp,RSA **rsa); +int i2d_RSA_PUBKEY_bio(BIO *bp,RSA *rsa); +#endif +#ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); +int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa); +DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); +int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa); +#endif +#ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); +int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); +int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey); +#endif +X509_SIG *d2i_PKCS8_bio(BIO *bp,X509_SIG **p8); +int i2d_PKCS8_bio(BIO *bp,X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key); +int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); +int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); +#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); + +#endif /* !SSLEAY_MACROS */ + +int X509_cmp_time(ASN1_TIME *s, time_t *t); +int X509_cmp_current_time(ASN1_TIME *s); +ASN1_TIME * X509_time_adj(ASN1_TIME *s, long adj, time_t *t); +ASN1_TIME * X509_gmtime_adj(ASN1_TIME *s, long adj); + +const char * X509_get_default_cert_area(void ); +const char * X509_get_default_cert_dir(void ); +const char * X509_get_default_cert_file(void ); +const char * X509_get_default_cert_dir_env(void ); +const char * X509_get_default_cert_file_env(void ); +const char * X509_get_default_private_dir(void ); + +X509_REQ * X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +X509 * X509_REQ_to_X509(X509_REQ *r, int days,EVP_PKEY *pkey); + +DECLARE_ASN1_FUNCTIONS(X509_ALGOR) +DECLARE_ASN1_FUNCTIONS(X509_VAL) + +DECLARE_ASN1_FUNCTIONS(X509_PUBKEY) + +int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey); +EVP_PKEY * X509_PUBKEY_get(X509_PUBKEY *key); +int X509_get_pubkey_parameters(EVP_PKEY *pkey, + STACK_OF(X509) *chain); +int i2d_PUBKEY(EVP_PKEY *a,unsigned char **pp); +EVP_PKEY * d2i_PUBKEY(EVP_PKEY **a,const unsigned char **pp, + long length); +#ifndef OPENSSL_NO_RSA +int i2d_RSA_PUBKEY(RSA *a,unsigned char **pp); +RSA * d2i_RSA_PUBKEY(RSA **a,const unsigned char **pp, + long length); +#endif +#ifndef OPENSSL_NO_DSA +int i2d_DSA_PUBKEY(DSA *a,unsigned char **pp); +DSA * d2i_DSA_PUBKEY(DSA **a,const unsigned char **pp, + long length); +#endif +#ifndef OPENSSL_NO_EC +int i2d_EC_PUBKEY(EC_KEY *a, unsigned char **pp); +EC_KEY *d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp, + long length); +#endif + +DECLARE_ASN1_FUNCTIONS(X509_SIG) +DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO) +DECLARE_ASN1_FUNCTIONS(X509_REQ) + +DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE) +X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value); + +DECLARE_ASN1_FUNCTIONS(X509_EXTENSION) + +DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY) + +DECLARE_ASN1_FUNCTIONS(X509_NAME) + +int X509_NAME_set(X509_NAME **xn, X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(X509_CINF) + +DECLARE_ASN1_FUNCTIONS(X509) +DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX) + +DECLARE_ASN1_FUNCTIONS(X509_CERT_PAIR) + +int X509_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int X509_set_ex_data(X509 *r, int idx, void *arg); +void *X509_get_ex_data(X509 *r, int idx); +int i2d_X509_AUX(X509 *a,unsigned char **pp); +X509 * d2i_X509_AUX(X509 **a,const unsigned char **pp,long length); + +int X509_alias_set1(X509 *x, unsigned char *name, int len); +int X509_keyid_set1(X509 *x, unsigned char *id, int len); +unsigned char * X509_alias_get0(X509 *x, int *len); +unsigned char * X509_keyid_get0(X509 *x, int *len); +int (*X509_TRUST_set_default(int (*trust)(int , X509 *, int)))(int, X509 *, int); +int X509_TRUST_set(int *t, int trust); +int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj); +int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj); +void X509_trust_clear(X509 *x); +void X509_reject_clear(X509 *x); + +DECLARE_ASN1_FUNCTIONS(X509_REVOKED) +DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO) +DECLARE_ASN1_FUNCTIONS(X509_CRL) + +int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); + +X509_PKEY * X509_PKEY_new(void ); +void X509_PKEY_free(X509_PKEY *a); +int i2d_X509_PKEY(X509_PKEY *a,unsigned char **pp); +X509_PKEY * d2i_X509_PKEY(X509_PKEY **a,const unsigned char **pp,long length); + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE) + +#ifndef OPENSSL_NO_EVP +X509_INFO * X509_INFO_new(void); +void X509_INFO_free(X509_INFO *a); +char * X509_NAME_oneline(X509_NAME *a,char *buf,int size); + +int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature,char *data,EVP_PKEY *pkey); + +int ASN1_digest(i2d_of_void *i2d,const EVP_MD *type,char *data, + unsigned char *md,unsigned int *len); + +int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + char *data,EVP_PKEY *pkey, const EVP_MD *type); + +int ASN1_item_digest(const ASN1_ITEM *it,const EVP_MD *type,void *data, + unsigned char *md,unsigned int *len); + +int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature,void *data,EVP_PKEY *pkey); + +int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, + ASN1_BIT_STRING *signature, + void *data, EVP_PKEY *pkey, const EVP_MD *type); +#endif + +int X509_set_version(X509 *x,long version); +int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial); +ASN1_INTEGER * X509_get_serialNumber(X509 *x); +int X509_set_issuer_name(X509 *x, X509_NAME *name); +X509_NAME * X509_get_issuer_name(X509 *a); +int X509_set_subject_name(X509 *x, X509_NAME *name); +X509_NAME * X509_get_subject_name(X509 *a); +int X509_set_notBefore(X509 *x, ASN1_TIME *tm); +int X509_set_notAfter(X509 *x, ASN1_TIME *tm); +int X509_set_pubkey(X509 *x, EVP_PKEY *pkey); +EVP_PKEY * X509_get_pubkey(X509 *x); +ASN1_BIT_STRING * X509_get0_pubkey_bitstr(const X509 *x); +int X509_certificate_type(X509 *x,EVP_PKEY *pubkey /* optional */); + +int X509_REQ_set_version(X509_REQ *x,long version); +int X509_REQ_set_subject_name(X509_REQ *req,X509_NAME *name); +int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); +EVP_PKEY * X509_REQ_get_pubkey(X509_REQ *req); +int X509_REQ_extension_nid(int nid); +int * X509_REQ_get_extension_nids(void); +void X509_REQ_set_extension_nids(int *nids); +STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req); +int X509_REQ_add_extensions_nid(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts, + int nid); +int X509_REQ_add_extensions(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts); +int X509_REQ_get_attr_count(const X509_REQ *req); +int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, + int lastpos); +int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); +X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); +int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); +int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_NID(X509_REQ *req, + int nid, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_txt(X509_REQ *req, + const char *attrname, int type, + const unsigned char *bytes, int len); + +int X509_CRL_set_version(X509_CRL *x, long version); +int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name); +int X509_CRL_set_lastUpdate(X509_CRL *x, ASN1_TIME *tm); +int X509_CRL_set_nextUpdate(X509_CRL *x, ASN1_TIME *tm); +int X509_CRL_sort(X509_CRL *crl); + +int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); +int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); + +int X509_REQ_check_private_key(X509_REQ *x509,EVP_PKEY *pkey); + +int X509_check_private_key(X509 *x509,EVP_PKEY *pkey); + +int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_and_serial_hash(X509 *a); + +int X509_issuer_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_name_hash(X509 *a); + +int X509_subject_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_subject_name_hash(X509 *x); + +int X509_cmp(const X509 *a, const X509 *b); +int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); +unsigned long X509_NAME_hash(X509_NAME *x); + +int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); +#ifndef OPENSSL_NO_FP_API +int X509_print_ex_fp(FILE *bp,X509 *x, unsigned long nmflag, unsigned long cflag); +int X509_print_fp(FILE *bp,X509 *x); +int X509_CRL_print_fp(FILE *bp,X509_CRL *x); +int X509_REQ_print_fp(FILE *bp,X509_REQ *req); +int X509_NAME_print_ex_fp(FILE *fp, X509_NAME *nm, int indent, unsigned long flags); +#endif + +#ifndef OPENSSL_NO_BIO +int X509_NAME_print(BIO *bp, X509_NAME *name, int obase); +int X509_NAME_print_ex(BIO *out, X509_NAME *nm, int indent, unsigned long flags); +int X509_print_ex(BIO *bp,X509 *x, unsigned long nmflag, unsigned long cflag); +int X509_print(BIO *bp,X509 *x); +int X509_ocspid_print(BIO *bp,X509 *x); +int X509_CERT_AUX_print(BIO *bp,X509_CERT_AUX *x, int indent); +int X509_CRL_print(BIO *bp,X509_CRL *x); +int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, unsigned long cflag); +int X509_REQ_print(BIO *bp,X509_REQ *req); +#endif + +int X509_NAME_entry_count(X509_NAME *name); +int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, + char *buf,int len); +int X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, + char *buf,int len); + +/* NOTE: you should be passsing -1, not 0 as lastpos. The functions that use + * lastpos, search after that position on. */ +int X509_NAME_get_index_by_NID(X509_NAME *name,int nid,int lastpos); +int X509_NAME_get_index_by_OBJ(X509_NAME *name,ASN1_OBJECT *obj, + int lastpos); +X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc); +X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); +int X509_NAME_add_entry(X509_NAME *name,X509_NAME_ENTRY *ne, + int loc, int set); +int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type, + unsigned char *bytes, int len, int loc, int set); +int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, + unsigned char *bytes, int len, int loc, int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, + const char *field, int type, const unsigned char *bytes, int len); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, + int type,unsigned char *bytes, int len); +int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, + const unsigned char *bytes, int len, int loc, int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, + ASN1_OBJECT *obj, int type,const unsigned char *bytes, + int len); +int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, + ASN1_OBJECT *obj); +int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, + const unsigned char *bytes, int len); +ASN1_OBJECT * X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne); +ASN1_STRING * X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne); + +int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); +int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, + int nid, int lastpos); +int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x, + ASN1_OBJECT *obj,int lastpos); +int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x, + int crit, int lastpos); +X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc); +X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc); +STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, + X509_EXTENSION *ex, int loc); + +int X509_get_ext_count(X509 *x); +int X509_get_ext_by_NID(X509 *x, int nid, int lastpos); +int X509_get_ext_by_OBJ(X509 *x,ASN1_OBJECT *obj,int lastpos); +int X509_get_ext_by_critical(X509 *x, int crit, int lastpos); +X509_EXTENSION *X509_get_ext(X509 *x, int loc); +X509_EXTENSION *X509_delete_ext(X509 *x, int loc); +int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc); +void * X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx); +int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_CRL_get_ext_count(X509_CRL *x); +int X509_CRL_get_ext_by_NID(X509_CRL *x, int nid, int lastpos); +int X509_CRL_get_ext_by_OBJ(X509_CRL *x,ASN1_OBJECT *obj,int lastpos); +int X509_CRL_get_ext_by_critical(X509_CRL *x, int crit, int lastpos); +X509_EXTENSION *X509_CRL_get_ext(X509_CRL *x, int loc); +X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc); +int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc); +void * X509_CRL_get_ext_d2i(X509_CRL *x, int nid, int *crit, int *idx); +int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_REVOKED_get_ext_count(X509_REVOKED *x); +int X509_REVOKED_get_ext_by_NID(X509_REVOKED *x, int nid, int lastpos); +int X509_REVOKED_get_ext_by_OBJ(X509_REVOKED *x,ASN1_OBJECT *obj,int lastpos); +int X509_REVOKED_get_ext_by_critical(X509_REVOKED *x, int crit, int lastpos); +X509_EXTENSION *X509_REVOKED_get_ext(X509_REVOKED *x, int loc); +X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc); +int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc); +void * X509_REVOKED_get_ext_d2i(X509_REVOKED *x, int nid, int *crit, int *idx); +int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit, + unsigned long flags); + +X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, + int nid, int crit, ASN1_OCTET_STRING *data); +X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, + ASN1_OBJECT *obj,int crit,ASN1_OCTET_STRING *data); +int X509_EXTENSION_set_object(X509_EXTENSION *ex,ASN1_OBJECT *obj); +int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit); +int X509_EXTENSION_set_data(X509_EXTENSION *ex, + ASN1_OCTET_STRING *data); +ASN1_OBJECT * X509_EXTENSION_get_object(X509_EXTENSION *ex); +ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne); +int X509_EXTENSION_get_critical(X509_EXTENSION *ex); + +int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x); +int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, + int lastpos); +int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc); +X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, + X509_ATTRIBUTE *attr); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x, + int nid, int type, + const unsigned char *bytes, int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x, + const char *attrname, int type, + const unsigned char *bytes, int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, + int atrtype, const void *data, int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, + const ASN1_OBJECT *obj, int atrtype, const void *data, int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, + const char *atrname, int type, const unsigned char *bytes, int len); +int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj); +int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *data, int len); +void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, + int atrtype, void *data); +int X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr); +ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); +ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx); + +int EVP_PKEY_get_attr_count(const EVP_PKEY *key); +int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid, + int lastpos); +int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc); +X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc); +int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr); +int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key, + int nid, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key, + const char *attrname, int type, + const unsigned char *bytes, int len); + +int X509_verify_cert(X509_STORE_CTX *ctx); + +/* lookup a cert from a X509 STACK */ +X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk,X509_NAME *name, + ASN1_INTEGER *serial); +X509 *X509_find_by_subject(STACK_OF(X509) *sk,X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(PBEPARAM) +DECLARE_ASN1_FUNCTIONS(PBE2PARAM) +DECLARE_ASN1_FUNCTIONS(PBKDF2PARAM) + +X509_ALGOR *PKCS5_pbe_set(int alg, int iter, unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen); + +/* PKCS#8 utilities */ + +DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) + +EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken); +PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken); + +int X509_check_trust(X509 *x, int id, int flags); +int X509_TRUST_get_count(void); +X509_TRUST * X509_TRUST_get0(int idx); +int X509_TRUST_get_by_id(int id); +int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int), + char *name, int arg1, void *arg2); +void X509_TRUST_cleanup(void); +int X509_TRUST_get_flags(X509_TRUST *xp); +char *X509_TRUST_get0_name(X509_TRUST *xp); +int X509_TRUST_get_trust(X509_TRUST *xp); + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_X509_strings(void); + +/* Error codes for the X509 functions. */ + +/* Function codes. */ +#define X509_F_ADD_CERT_DIR 100 +#define X509_F_BY_FILE_CTRL 101 +#define X509_F_CHECK_POLICY 145 +#define X509_F_DIR_CTRL 102 +#define X509_F_GET_CERT_BY_SUBJECT 103 +#define X509_F_NETSCAPE_SPKI_B64_DECODE 129 +#define X509_F_NETSCAPE_SPKI_B64_ENCODE 130 +#define X509_F_X509AT_ADD1_ATTR 135 +#define X509_F_X509V3_ADD_EXT 104 +#define X509_F_X509_ATTRIBUTE_CREATE_BY_NID 136 +#define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ 137 +#define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT 140 +#define X509_F_X509_ATTRIBUTE_GET0_DATA 139 +#define X509_F_X509_ATTRIBUTE_SET1_DATA 138 +#define X509_F_X509_CHECK_PRIVATE_KEY 128 +#define X509_F_X509_CRL_PRINT_FP 147 +#define X509_F_X509_EXTENSION_CREATE_BY_NID 108 +#define X509_F_X509_EXTENSION_CREATE_BY_OBJ 109 +#define X509_F_X509_GET_PUBKEY_PARAMETERS 110 +#define X509_F_X509_LOAD_CERT_CRL_FILE 132 +#define X509_F_X509_LOAD_CERT_FILE 111 +#define X509_F_X509_LOAD_CRL_FILE 112 +#define X509_F_X509_NAME_ADD_ENTRY 113 +#define X509_F_X509_NAME_ENTRY_CREATE_BY_NID 114 +#define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT 131 +#define X509_F_X509_NAME_ENTRY_SET_OBJECT 115 +#define X509_F_X509_NAME_ONELINE 116 +#define X509_F_X509_NAME_PRINT 117 +#define X509_F_X509_PRINT_EX_FP 118 +#define X509_F_X509_PUBKEY_GET 119 +#define X509_F_X509_PUBKEY_SET 120 +#define X509_F_X509_REQ_CHECK_PRIVATE_KEY 144 +#define X509_F_X509_REQ_PRINT_EX 121 +#define X509_F_X509_REQ_PRINT_FP 122 +#define X509_F_X509_REQ_TO_X509 123 +#define X509_F_X509_STORE_ADD_CERT 124 +#define X509_F_X509_STORE_ADD_CRL 125 +#define X509_F_X509_STORE_CTX_GET1_ISSUER 146 +#define X509_F_X509_STORE_CTX_INIT 143 +#define X509_F_X509_STORE_CTX_NEW 142 +#define X509_F_X509_STORE_CTX_PURPOSE_INHERIT 134 +#define X509_F_X509_TO_X509_REQ 126 +#define X509_F_X509_TRUST_ADD 133 +#define X509_F_X509_TRUST_SET 141 +#define X509_F_X509_VERIFY_CERT 127 + +/* Reason codes. */ +#define X509_R_BAD_X509_FILETYPE 100 +#define X509_R_BASE64_DECODE_ERROR 118 +#define X509_R_CANT_CHECK_DH_KEY 114 +#define X509_R_CERT_ALREADY_IN_HASH_TABLE 101 +#define X509_R_ERR_ASN1_LIB 102 +#define X509_R_INVALID_DIRECTORY 113 +#define X509_R_INVALID_FIELD_NAME 119 +#define X509_R_INVALID_TRUST 123 +#define X509_R_KEY_TYPE_MISMATCH 115 +#define X509_R_KEY_VALUES_MISMATCH 116 +#define X509_R_LOADING_CERT_DIR 103 +#define X509_R_LOADING_DEFAULTS 104 +#define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY 105 +#define X509_R_SHOULD_RETRY 106 +#define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN 107 +#define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY 108 +#define X509_R_UNKNOWN_KEY_TYPE 117 +#define X509_R_UNKNOWN_NID 109 +#define X509_R_UNKNOWN_PURPOSE_ID 121 +#define X509_R_UNKNOWN_TRUST_ID 120 +#define X509_R_UNSUPPORTED_ALGORITHM 111 +#define X509_R_WRONG_LOOKUP_TYPE 112 +#define X509_R_WRONG_TYPE 122 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/include/openssl/x509_vfy.h b/mswin32/OpenSSL/include/openssl/x509_vfy.h new file mode 100755 index 000000000..76c76e171 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/x509_vfy.h @@ -0,0 +1,531 @@ +/* crypto/x509/x509_vfy.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.] + */ + +#ifndef HEADER_X509_H +#include +/* openssl/x509.h ends up #include-ing this file at about the only + * appropriate moment. */ +#endif + +#ifndef HEADER_X509_VFY_H +#define HEADER_X509_VFY_H + +#include +#ifndef OPENSSL_NO_LHASH +#include +#endif +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Outer object */ +typedef struct x509_hash_dir_st + { + int num_dirs; + char **dirs; + int *dirs_type; + int num_dirs_alloced; + } X509_HASH_DIR_CTX; + +typedef struct x509_file_st + { + int num_paths; /* number of paths to files or directories */ + int num_alloced; + char **paths; /* the list of paths or directories */ + int *path_type; + } X509_CERT_FILE_CTX; + +/*******************************/ +/* +SSL_CTX -> X509_STORE + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + +SSL -> X509_STORE_CTX + ->X509_STORE + +The X509_STORE holds the tables etc for verification stuff. +A X509_STORE_CTX is used while validating a single certificate. +The X509_STORE has X509_LOOKUPs for looking up certs. +The X509_STORE then calls a function to actually verify the +certificate chain. +*/ + +#define X509_LU_RETRY -1 +#define X509_LU_FAIL 0 +#define X509_LU_X509 1 +#define X509_LU_CRL 2 +#define X509_LU_PKEY 3 + +typedef struct x509_object_st + { + /* one of the above types */ + int type; + union { + char *ptr; + X509 *x509; + X509_CRL *crl; + EVP_PKEY *pkey; + } data; + } X509_OBJECT; + +typedef struct x509_lookup_st X509_LOOKUP; + +DECLARE_STACK_OF(X509_LOOKUP) +DECLARE_STACK_OF(X509_OBJECT) + +/* This is a static that defines the function interface */ +typedef struct x509_lookup_method_st + { + const char *name; + int (*new_item)(X509_LOOKUP *ctx); + void (*free)(X509_LOOKUP *ctx); + int (*init)(X509_LOOKUP *ctx); + int (*shutdown)(X509_LOOKUP *ctx); + int (*ctrl)(X509_LOOKUP *ctx,int cmd,const char *argc,long argl, + char **ret); + int (*get_by_subject)(X509_LOOKUP *ctx,int type,X509_NAME *name, + X509_OBJECT *ret); + int (*get_by_issuer_serial)(X509_LOOKUP *ctx,int type,X509_NAME *name, + ASN1_INTEGER *serial,X509_OBJECT *ret); + int (*get_by_fingerprint)(X509_LOOKUP *ctx,int type, + unsigned char *bytes,int len, + X509_OBJECT *ret); + int (*get_by_alias)(X509_LOOKUP *ctx,int type,char *str,int len, + X509_OBJECT *ret); + } X509_LOOKUP_METHOD; + +/* This structure hold all parameters associated with a verify operation + * by including an X509_VERIFY_PARAM structure in related structures the + * parameters used can be customized + */ + +typedef struct X509_VERIFY_PARAM_st + { + char *name; + time_t check_time; /* Time to use */ + unsigned long inh_flags; /* Inheritance flags */ + unsigned long flags; /* Various verify flags */ + int purpose; /* purpose to check untrusted certificates */ + int trust; /* trust setting to check */ + int depth; /* Verify depth */ + STACK_OF(ASN1_OBJECT) *policies; /* Permissible policies */ + } X509_VERIFY_PARAM; + +DECLARE_STACK_OF(X509_VERIFY_PARAM) + +/* This is used to hold everything. It is used for all certificate + * validation. Once we have a certificate chain, the 'verify' + * function is then called to actually check the cert chain. */ +struct x509_store_st + { + /* The following is a cache of trusted certs */ + int cache; /* if true, stash any hits */ + STACK_OF(X509_OBJECT) *objs; /* Cache of all objects */ + + /* These are external lookup methods */ + STACK_OF(X509_LOOKUP) *get_cert_methods; + + X509_VERIFY_PARAM *param; + + /* Callbacks for various operations */ + int (*verify)(X509_STORE_CTX *ctx); /* called to verify a certificate */ + int (*verify_cb)(int ok,X509_STORE_CTX *ctx); /* error callback */ + int (*get_issuer)(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); /* get issuers cert from ctx */ + int (*check_issued)(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); /* check issued */ + int (*check_revocation)(X509_STORE_CTX *ctx); /* Check revocation status of chain */ + int (*get_crl)(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); /* retrieve CRL */ + int (*check_crl)(X509_STORE_CTX *ctx, X509_CRL *crl); /* Check CRL validity */ + int (*cert_crl)(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); /* Check certificate against CRL */ + int (*cleanup)(X509_STORE_CTX *ctx); + + CRYPTO_EX_DATA ex_data; + int references; + } /* X509_STORE */; + +int X509_STORE_set_depth(X509_STORE *store, int depth); + +#define X509_STORE_set_verify_cb_func(ctx,func) ((ctx)->verify_cb=(func)) +#define X509_STORE_set_verify_func(ctx,func) ((ctx)->verify=(func)) + +/* This is the functions plus an instance of the local variables. */ +struct x509_lookup_st + { + int init; /* have we been started */ + int skip; /* don't use us. */ + X509_LOOKUP_METHOD *method; /* the functions */ + char *method_data; /* method data */ + + X509_STORE *store_ctx; /* who owns us */ + } /* X509_LOOKUP */; + +/* This is a used when verifying cert chains. Since the + * gathering of the cert chain can take some time (and have to be + * 'retried', this needs to be kept and passed around. */ +struct x509_store_ctx_st /* X509_STORE_CTX */ + { + X509_STORE *ctx; + int current_method; /* used when looking up certs */ + + /* The following are set by the caller */ + X509 *cert; /* The cert to check */ + STACK_OF(X509) *untrusted; /* chain of X509s - untrusted - passed in */ + STACK_OF(X509_CRL) *crls; /* set of CRLs passed in */ + + X509_VERIFY_PARAM *param; + void *other_ctx; /* Other info for use with get_issuer() */ + + /* Callbacks for various operations */ + int (*verify)(X509_STORE_CTX *ctx); /* called to verify a certificate */ + int (*verify_cb)(int ok,X509_STORE_CTX *ctx); /* error callback */ + int (*get_issuer)(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); /* get issuers cert from ctx */ + int (*check_issued)(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); /* check issued */ + int (*check_revocation)(X509_STORE_CTX *ctx); /* Check revocation status of chain */ + int (*get_crl)(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); /* retrieve CRL */ + int (*check_crl)(X509_STORE_CTX *ctx, X509_CRL *crl); /* Check CRL validity */ + int (*cert_crl)(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); /* Check certificate against CRL */ + int (*check_policy)(X509_STORE_CTX *ctx); + int (*cleanup)(X509_STORE_CTX *ctx); + + /* The following is built up */ + int valid; /* if 0, rebuild chain */ + int last_untrusted; /* index of last untrusted cert */ + STACK_OF(X509) *chain; /* chain of X509s - built up and trusted */ + X509_POLICY_TREE *tree; /* Valid policy tree */ + + int explicit_policy; /* Require explicit policy value */ + + /* When something goes wrong, this is why */ + int error_depth; + int error; + X509 *current_cert; + X509 *current_issuer; /* cert currently being tested as valid issuer */ + X509_CRL *current_crl; /* current CRL */ + + CRYPTO_EX_DATA ex_data; + } /* X509_STORE_CTX */; + +void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); + +#define X509_STORE_CTX_set_app_data(ctx,data) \ + X509_STORE_CTX_set_ex_data(ctx,0,data) +#define X509_STORE_CTX_get_app_data(ctx) \ + X509_STORE_CTX_get_ex_data(ctx,0) + +#define X509_L_FILE_LOAD 1 +#define X509_L_ADD_DIR 2 + +#define X509_LOOKUP_load_file(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(long)(type),NULL) + +#define X509_LOOKUP_add_dir(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(long)(type),NULL) + +#define X509_V_OK 0 +/* illegal error (for uninitialized values, to avoid X509_V_OK): 1 */ + +#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 +#define X509_V_ERR_UNABLE_TO_GET_CRL 3 +#define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 +#define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 +#define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 +#define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 +#define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 +#define X509_V_ERR_CERT_NOT_YET_VALID 9 +#define X509_V_ERR_CERT_HAS_EXPIRED 10 +#define X509_V_ERR_CRL_NOT_YET_VALID 11 +#define X509_V_ERR_CRL_HAS_EXPIRED 12 +#define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 +#define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 +#define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 +#define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 +#define X509_V_ERR_OUT_OF_MEM 17 +#define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 +#define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 +#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 +#define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 +#define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 +#define X509_V_ERR_CERT_REVOKED 23 +#define X509_V_ERR_INVALID_CA 24 +#define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 +#define X509_V_ERR_INVALID_PURPOSE 26 +#define X509_V_ERR_CERT_UNTRUSTED 27 +#define X509_V_ERR_CERT_REJECTED 28 +/* These are 'informational' when looking for issuer cert */ +#define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 +#define X509_V_ERR_AKID_SKID_MISMATCH 30 +#define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 +#define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 + +#define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 +#define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 +#define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 +#define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 +#define X509_V_ERR_INVALID_NON_CA 37 +#define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 +#define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 +#define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 + +#define X509_V_ERR_INVALID_EXTENSION 41 +#define X509_V_ERR_INVALID_POLICY_EXTENSION 42 +#define X509_V_ERR_NO_EXPLICIT_POLICY 43 + +#define X509_V_ERR_UNNESTED_RESOURCE 44 + +/* The application is not happy */ +#define X509_V_ERR_APPLICATION_VERIFICATION 50 + +/* Certificate verify flags */ + +/* Send issuer+subject checks to verify_cb */ +#define X509_V_FLAG_CB_ISSUER_CHECK 0x1 +/* Use check time instead of current time */ +#define X509_V_FLAG_USE_CHECK_TIME 0x2 +/* Lookup CRLs */ +#define X509_V_FLAG_CRL_CHECK 0x4 +/* Lookup CRLs for whole chain */ +#define X509_V_FLAG_CRL_CHECK_ALL 0x8 +/* Ignore unhandled critical extensions */ +#define X509_V_FLAG_IGNORE_CRITICAL 0x10 +/* Disable workarounds for broken certificates */ +#define X509_V_FLAG_X509_STRICT 0x20 +/* Enable proxy certificate validation */ +#define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 +/* Enable policy checking */ +#define X509_V_FLAG_POLICY_CHECK 0x80 +/* Policy variable require-explicit-policy */ +#define X509_V_FLAG_EXPLICIT_POLICY 0x100 +/* Policy variable inhibit-any-policy */ +#define X509_V_FLAG_INHIBIT_ANY 0x200 +/* Policy variable inhibit-policy-mapping */ +#define X509_V_FLAG_INHIBIT_MAP 0x400 +/* Notify callback that policy is OK */ +#define X509_V_FLAG_NOTIFY_POLICY 0x800 + +#define X509_VP_FLAG_DEFAULT 0x1 +#define X509_VP_FLAG_OVERWRITE 0x2 +#define X509_VP_FLAG_RESET_FLAGS 0x4 +#define X509_VP_FLAG_LOCKED 0x8 +#define X509_VP_FLAG_ONCE 0x10 + +/* Internal use: mask of policy related options */ +#define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \ + | X509_V_FLAG_EXPLICIT_POLICY \ + | X509_V_FLAG_INHIBIT_ANY \ + | X509_V_FLAG_INHIBIT_MAP) + +int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, + X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h,int type,X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, X509_OBJECT *x); +void X509_OBJECT_up_ref_count(X509_OBJECT *a); +void X509_OBJECT_free_contents(X509_OBJECT *a); +X509_STORE *X509_STORE_new(void ); +void X509_STORE_free(X509_STORE *v); + +int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags); +int X509_STORE_set_purpose(X509_STORE *ctx, int purpose); +int X509_STORE_set_trust(X509_STORE *ctx, int trust); +int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *pm); + +X509_STORE_CTX *X509_STORE_CTX_new(void); + +int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + +void X509_STORE_CTX_free(X509_STORE_CTX *ctx); +int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, + X509 *x509, STACK_OF(X509) *chain); +void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); + +X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m); + +X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void); +X509_LOOKUP_METHOD *X509_LOOKUP_file(void); + +int X509_STORE_add_cert(X509_STORE *ctx, X509 *x); +int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x); + +int X509_STORE_get_by_subject(X509_STORE_CTX *vs,int type,X509_NAME *name, + X509_OBJECT *ret); + +int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); + +#ifndef OPENSSL_NO_STDIO +int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type); +#endif + + +X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method); +void X509_LOOKUP_free(X509_LOOKUP *ctx); +int X509_LOOKUP_init(X509_LOOKUP *ctx); +int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, + X509_OBJECT *ret); +int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name, + ASN1_INTEGER *serial, X509_OBJECT *ret); +int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type, + unsigned char *bytes, int len, X509_OBJECT *ret); +int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str, + int len, X509_OBJECT *ret); +int X509_LOOKUP_shutdown(X509_LOOKUP *ctx); + +#ifndef OPENSSL_NO_STDIO +int X509_STORE_load_locations (X509_STORE *ctx, + const char *file, const char *dir); +int X509_STORE_set_default_paths(X509_STORE *ctx); +#endif + +int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx,int idx,void *data); +void * X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx,int idx); +int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx,int s); +int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx); +X509 * X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_cert(X509_STORE_CTX *c,X509 *x); +void X509_STORE_CTX_set_chain(X509_STORE_CTX *c,STACK_OF(X509) *sk); +void X509_STORE_CTX_set0_crls(X509_STORE_CTX *c,STACK_OF(X509_CRL) *sk); +int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose); +int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust); +int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose, + int purpose, int trust); +void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags); +void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, + time_t t); +void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, + int (*verify_cb)(int, X509_STORE_CTX *)); + +X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx); + +X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param); +int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name); + +/* X509_VERIFY_PARAM functions */ + +X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); +void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name); +int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags); +int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose); +int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust); +void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); +void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); +int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, + ASN1_OBJECT *policy); +int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, + STACK_OF(ASN1_OBJECT) *policies); +int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); + +int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); +void X509_VERIFY_PARAM_table_cleanup(void); + +int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, + STACK_OF(X509) *certs, + STACK_OF(ASN1_OBJECT) *policy_oids, + unsigned int flags); + +void X509_policy_tree_free(X509_POLICY_TREE *tree); + +int X509_policy_tree_level_count(const X509_POLICY_TREE *tree); +X509_POLICY_LEVEL * + X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, int i); + +STACK_OF(X509_POLICY_NODE) * + X509_policy_tree_get0_policies(const X509_POLICY_TREE *tree); + +STACK_OF(X509_POLICY_NODE) * + X509_policy_tree_get0_user_policies(const X509_POLICY_TREE *tree); + +int X509_policy_level_node_count(X509_POLICY_LEVEL *level); + +X509_POLICY_NODE *X509_policy_level_get0_node(X509_POLICY_LEVEL *level, int i); + +const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node); + +STACK_OF(POLICYQUALINFO) * + X509_policy_node_get0_qualifiers(const X509_POLICY_NODE *node); +const X509_POLICY_NODE * + X509_policy_node_get0_parent(const X509_POLICY_NODE *node); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/mswin32/OpenSSL/include/openssl/x509v3.h b/mswin32/OpenSSL/include/openssl/x509v3.h new file mode 100755 index 000000000..91d2fb5b8 --- /dev/null +++ b/mswin32/OpenSSL/include/openssl/x509v3.h @@ -0,0 +1,919 @@ +/* x509v3.h */ +/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL + * project 1999. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * 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 above 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 acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_X509V3_H +#define HEADER_X509V3_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward reference */ +struct v3_ext_method; +struct v3_ext_ctx; + +/* Useful typedefs */ + +typedef void * (*X509V3_EXT_NEW)(void); +typedef void (*X509V3_EXT_FREE)(void *); +typedef void * (*X509V3_EXT_D2I)(void *, const unsigned char ** , long); +typedef int (*X509V3_EXT_I2D)(void *, unsigned char **); +typedef STACK_OF(CONF_VALUE) * (*X509V3_EXT_I2V)(struct v3_ext_method *method, void *ext, STACK_OF(CONF_VALUE) *extlist); +typedef void * (*X509V3_EXT_V2I)(struct v3_ext_method *method, struct v3_ext_ctx *ctx, STACK_OF(CONF_VALUE) *values); +typedef char * (*X509V3_EXT_I2S)(struct v3_ext_method *method, void *ext); +typedef void * (*X509V3_EXT_S2I)(struct v3_ext_method *method, struct v3_ext_ctx *ctx, const char *str); +typedef int (*X509V3_EXT_I2R)(struct v3_ext_method *method, void *ext, BIO *out, int indent); +typedef void * (*X509V3_EXT_R2I)(struct v3_ext_method *method, struct v3_ext_ctx *ctx, const char *str); + +/* V3 extension structure */ + +struct v3_ext_method { +int ext_nid; +int ext_flags; +/* If this is set the following four fields are ignored */ +ASN1_ITEM_EXP *it; +/* Old style ASN1 calls */ +X509V3_EXT_NEW ext_new; +X509V3_EXT_FREE ext_free; +X509V3_EXT_D2I d2i; +X509V3_EXT_I2D i2d; + +/* The following pair is used for string extensions */ +X509V3_EXT_I2S i2s; +X509V3_EXT_S2I s2i; + +/* The following pair is used for multi-valued extensions */ +X509V3_EXT_I2V i2v; +X509V3_EXT_V2I v2i; + +/* The following are used for raw extensions */ +X509V3_EXT_I2R i2r; +X509V3_EXT_R2I r2i; + +void *usr_data; /* Any extension specific data */ +}; + +typedef struct X509V3_CONF_METHOD_st { +char * (*get_string)(void *db, char *section, char *value); +STACK_OF(CONF_VALUE) * (*get_section)(void *db, char *section); +void (*free_string)(void *db, char * string); +void (*free_section)(void *db, STACK_OF(CONF_VALUE) *section); +} X509V3_CONF_METHOD; + +/* Context specific info */ +struct v3_ext_ctx { +#define CTX_TEST 0x1 +int flags; +X509 *issuer_cert; +X509 *subject_cert; +X509_REQ *subject_req; +X509_CRL *crl; +X509V3_CONF_METHOD *db_meth; +void *db; +/* Maybe more here */ +}; + +typedef struct v3_ext_method X509V3_EXT_METHOD; + +DECLARE_STACK_OF(X509V3_EXT_METHOD) + +/* ext_flags values */ +#define X509V3_EXT_DYNAMIC 0x1 +#define X509V3_EXT_CTX_DEP 0x2 +#define X509V3_EXT_MULTILINE 0x4 + +typedef BIT_STRING_BITNAME ENUMERATED_NAMES; + +typedef struct BASIC_CONSTRAINTS_st { +int ca; +ASN1_INTEGER *pathlen; +} BASIC_CONSTRAINTS; + + +typedef struct PKEY_USAGE_PERIOD_st { +ASN1_GENERALIZEDTIME *notBefore; +ASN1_GENERALIZEDTIME *notAfter; +} PKEY_USAGE_PERIOD; + +typedef struct otherName_st { +ASN1_OBJECT *type_id; +ASN1_TYPE *value; +} OTHERNAME; + +typedef struct EDIPartyName_st { + ASN1_STRING *nameAssigner; + ASN1_STRING *partyName; +} EDIPARTYNAME; + +typedef struct GENERAL_NAME_st { + +#define GEN_OTHERNAME 0 +#define GEN_EMAIL 1 +#define GEN_DNS 2 +#define GEN_X400 3 +#define GEN_DIRNAME 4 +#define GEN_EDIPARTY 5 +#define GEN_URI 6 +#define GEN_IPADD 7 +#define GEN_RID 8 + +int type; +union { + char *ptr; + OTHERNAME *otherName; /* otherName */ + ASN1_IA5STRING *rfc822Name; + ASN1_IA5STRING *dNSName; + ASN1_TYPE *x400Address; + X509_NAME *directoryName; + EDIPARTYNAME *ediPartyName; + ASN1_IA5STRING *uniformResourceIdentifier; + ASN1_OCTET_STRING *iPAddress; + ASN1_OBJECT *registeredID; + + /* Old names */ + ASN1_OCTET_STRING *ip; /* iPAddress */ + X509_NAME *dirn; /* dirn */ + ASN1_IA5STRING *ia5;/* rfc822Name, dNSName, uniformResourceIdentifier */ + ASN1_OBJECT *rid; /* registeredID */ + ASN1_TYPE *other; /* x400Address */ +} d; +} GENERAL_NAME; + +typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; + +typedef struct ACCESS_DESCRIPTION_st { + ASN1_OBJECT *method; + GENERAL_NAME *location; +} ACCESS_DESCRIPTION; + +typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; + +typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE; + +DECLARE_STACK_OF(GENERAL_NAME) +DECLARE_ASN1_SET_OF(GENERAL_NAME) + +DECLARE_STACK_OF(ACCESS_DESCRIPTION) +DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION) + +typedef struct DIST_POINT_NAME_st { +int type; +union { + GENERAL_NAMES *fullname; + STACK_OF(X509_NAME_ENTRY) *relativename; +} name; +} DIST_POINT_NAME; + +typedef struct DIST_POINT_st { +DIST_POINT_NAME *distpoint; +ASN1_BIT_STRING *reasons; +GENERAL_NAMES *CRLissuer; +} DIST_POINT; + +typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS; + +DECLARE_STACK_OF(DIST_POINT) +DECLARE_ASN1_SET_OF(DIST_POINT) + +typedef struct AUTHORITY_KEYID_st { +ASN1_OCTET_STRING *keyid; +GENERAL_NAMES *issuer; +ASN1_INTEGER *serial; +} AUTHORITY_KEYID; + +/* Strong extranet structures */ + +typedef struct SXNET_ID_st { + ASN1_INTEGER *zone; + ASN1_OCTET_STRING *user; +} SXNETID; + +DECLARE_STACK_OF(SXNETID) +DECLARE_ASN1_SET_OF(SXNETID) + +typedef struct SXNET_st { + ASN1_INTEGER *version; + STACK_OF(SXNETID) *ids; +} SXNET; + +typedef struct NOTICEREF_st { + ASN1_STRING *organization; + STACK_OF(ASN1_INTEGER) *noticenos; +} NOTICEREF; + +typedef struct USERNOTICE_st { + NOTICEREF *noticeref; + ASN1_STRING *exptext; +} USERNOTICE; + +typedef struct POLICYQUALINFO_st { + ASN1_OBJECT *pqualid; + union { + ASN1_IA5STRING *cpsuri; + USERNOTICE *usernotice; + ASN1_TYPE *other; + } d; +} POLICYQUALINFO; + +DECLARE_STACK_OF(POLICYQUALINFO) +DECLARE_ASN1_SET_OF(POLICYQUALINFO) + +typedef struct POLICYINFO_st { + ASN1_OBJECT *policyid; + STACK_OF(POLICYQUALINFO) *qualifiers; +} POLICYINFO; + +typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; + +DECLARE_STACK_OF(POLICYINFO) +DECLARE_ASN1_SET_OF(POLICYINFO) + +typedef struct POLICY_MAPPING_st { + ASN1_OBJECT *issuerDomainPolicy; + ASN1_OBJECT *subjectDomainPolicy; +} POLICY_MAPPING; + +DECLARE_STACK_OF(POLICY_MAPPING) + +typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS; + +typedef struct GENERAL_SUBTREE_st { + GENERAL_NAME *base; + ASN1_INTEGER *minimum; + ASN1_INTEGER *maximum; +} GENERAL_SUBTREE; + +DECLARE_STACK_OF(GENERAL_SUBTREE) + +typedef struct NAME_CONSTRAINTS_st { + STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; + STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; +} NAME_CONSTRAINTS; + +typedef struct POLICY_CONSTRAINTS_st { + ASN1_INTEGER *requireExplicitPolicy; + ASN1_INTEGER *inhibitPolicyMapping; +} POLICY_CONSTRAINTS; + +/* Proxy certificate structures, see RFC 3820 */ +typedef struct PROXY_POLICY_st + { + ASN1_OBJECT *policyLanguage; + ASN1_OCTET_STRING *policy; + } PROXY_POLICY; + +typedef struct PROXY_CERT_INFO_EXTENSION_st + { + ASN1_INTEGER *pcPathLengthConstraint; + PROXY_POLICY *proxyPolicy; + } PROXY_CERT_INFO_EXTENSION; + +DECLARE_ASN1_FUNCTIONS(PROXY_POLICY) +DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) + + +#define X509V3_conf_err(val) ERR_add_error_data(6, "section:", val->section, \ +",name:", val->name, ",value:", val->value); + +#define X509V3_set_ctx_test(ctx) \ + X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST) +#define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; + +#define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \ + 0,0,0,0, \ + 0,0, \ + (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ + (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ + NULL, NULL, \ + table} + +#define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \ + 0,0,0,0, \ + (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ + 0,0,0,0, \ + NULL} + +#define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + + +/* X509_PURPOSE stuff */ + +#define EXFLAG_BCONS 0x1 +#define EXFLAG_KUSAGE 0x2 +#define EXFLAG_XKUSAGE 0x4 +#define EXFLAG_NSCERT 0x8 + +#define EXFLAG_CA 0x10 +#define EXFLAG_SS 0x20 +#define EXFLAG_V1 0x40 +#define EXFLAG_INVALID 0x80 +#define EXFLAG_SET 0x100 +#define EXFLAG_CRITICAL 0x200 +#define EXFLAG_PROXY 0x400 + +#define EXFLAG_INVALID_POLICY 0x400 + +#define KU_DIGITAL_SIGNATURE 0x0080 +#define KU_NON_REPUDIATION 0x0040 +#define KU_KEY_ENCIPHERMENT 0x0020 +#define KU_DATA_ENCIPHERMENT 0x0010 +#define KU_KEY_AGREEMENT 0x0008 +#define KU_KEY_CERT_SIGN 0x0004 +#define KU_CRL_SIGN 0x0002 +#define KU_ENCIPHER_ONLY 0x0001 +#define KU_DECIPHER_ONLY 0x8000 + +#define NS_SSL_CLIENT 0x80 +#define NS_SSL_SERVER 0x40 +#define NS_SMIME 0x20 +#define NS_OBJSIGN 0x10 +#define NS_SSL_CA 0x04 +#define NS_SMIME_CA 0x02 +#define NS_OBJSIGN_CA 0x01 +#define NS_ANY_CA (NS_SSL_CA|NS_SMIME_CA|NS_OBJSIGN_CA) + +#define XKU_SSL_SERVER 0x1 +#define XKU_SSL_CLIENT 0x2 +#define XKU_SMIME 0x4 +#define XKU_CODE_SIGN 0x8 +#define XKU_SGC 0x10 +#define XKU_OCSP_SIGN 0x20 +#define XKU_TIMESTAMP 0x40 +#define XKU_DVCS 0x80 + +#define X509_PURPOSE_DYNAMIC 0x1 +#define X509_PURPOSE_DYNAMIC_NAME 0x2 + +typedef struct x509_purpose_st { + int purpose; + int trust; /* Default trust ID */ + int flags; + int (*check_purpose)(const struct x509_purpose_st *, + const X509 *, int); + char *name; + char *sname; + void *usr_data; +} X509_PURPOSE; + +#define X509_PURPOSE_SSL_CLIENT 1 +#define X509_PURPOSE_SSL_SERVER 2 +#define X509_PURPOSE_NS_SSL_SERVER 3 +#define X509_PURPOSE_SMIME_SIGN 4 +#define X509_PURPOSE_SMIME_ENCRYPT 5 +#define X509_PURPOSE_CRL_SIGN 6 +#define X509_PURPOSE_ANY 7 +#define X509_PURPOSE_OCSP_HELPER 8 + +#define X509_PURPOSE_MIN 1 +#define X509_PURPOSE_MAX 8 + +/* Flags for X509V3_EXT_print() */ + +#define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) +/* Return error for unknown extensions */ +#define X509V3_EXT_DEFAULT 0 +/* Print error for unknown extensions */ +#define X509V3_EXT_ERROR_UNKNOWN (1L << 16) +/* ASN1 parse unknown extensions */ +#define X509V3_EXT_PARSE_UNKNOWN (2L << 16) +/* BIO_dump unknown extensions */ +#define X509V3_EXT_DUMP_UNKNOWN (3L << 16) + +/* Flags for X509V3_add1_i2d */ + +#define X509V3_ADD_OP_MASK 0xfL +#define X509V3_ADD_DEFAULT 0L +#define X509V3_ADD_APPEND 1L +#define X509V3_ADD_REPLACE 2L +#define X509V3_ADD_REPLACE_EXISTING 3L +#define X509V3_ADD_KEEP_EXISTING 4L +#define X509V3_ADD_DELETE 5L +#define X509V3_ADD_SILENT 0x10 + +DECLARE_STACK_OF(X509_PURPOSE) + +DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS) + +DECLARE_ASN1_FUNCTIONS(SXNET) +DECLARE_ASN1_FUNCTIONS(SXNETID) + +int SXNET_add_id_asc(SXNET **psx, char *zone, char *user, int userlen); +int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, char *user, int userlen); +int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, char *user, int userlen); + +ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, char *zone); +ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone); +ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone); + +DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID) + +DECLARE_ASN1_FUNCTIONS(PKEY_USAGE_PERIOD) + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAME) + + +ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); +STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + ASN1_BIT_STRING *bits, + STACK_OF(CONF_VALUE) *extlist); + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret); +int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen); + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES) + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, + GENERAL_NAMES *gen, STACK_OF(CONF_VALUE) *extlist); +GENERAL_NAMES *v2i_GENERAL_NAMES(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); + +DECLARE_ASN1_FUNCTIONS(OTHERNAME) +DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME) + +char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, ASN1_OCTET_STRING *ia5); +ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, char *str); + +DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE) +int i2a_ACCESS_DESCRIPTION(BIO *bp, ACCESS_DESCRIPTION* a); + +DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES) +DECLARE_ASN1_FUNCTIONS(POLICYINFO) +DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO) +DECLARE_ASN1_FUNCTIONS(USERNOTICE) +DECLARE_ASN1_FUNCTIONS(NOTICEREF) + +DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS) +DECLARE_ASN1_FUNCTIONS(DIST_POINT) +DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME) + +DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION) +DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS) + +DECLARE_ASN1_ITEM(POLICY_MAPPING) +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING) +DECLARE_ASN1_ITEM(POLICY_MAPPINGS) + +DECLARE_ASN1_ITEM(GENERAL_SUBTREE) +DECLARE_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) + +DECLARE_ASN1_ITEM(NAME_CONSTRAINTS) +DECLARE_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) + +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS) +DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS) + +#ifdef HEADER_CONF_H +GENERAL_NAME *v2i_GENERAL_NAME(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, + CONF_VALUE *cnf); +GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc); +void X509V3_conf_free(CONF_VALUE *val); + +X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, char *value); +X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, char *name, char *value); +int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, char *section, STACK_OF(X509_EXTENSION) **sk); +int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, X509 *cert); +int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, X509_CRL *crl); + +X509_EXTENSION *X509V3_EXT_conf_nid(LHASH *conf, X509V3_CTX *ctx, int ext_nid, char *value); +X509_EXTENSION *X509V3_EXT_conf(LHASH *conf, X509V3_CTX *ctx, char *name, char *value); +int X509V3_EXT_add_conf(LHASH *conf, X509V3_CTX *ctx, char *section, X509 *cert); +int X509V3_EXT_REQ_add_conf(LHASH *conf, X509V3_CTX *ctx, char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_conf(LHASH *conf, X509V3_CTX *ctx, char *section, X509_CRL *crl); + +int X509V3_add_value_bool_nf(char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool); +int X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint); +void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf); +void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH *lhash); +#endif + +char * X509V3_get_string(X509V3_CTX *ctx, char *name, char *section); +STACK_OF(CONF_VALUE) * X509V3_get_section(X509V3_CTX *ctx, char *section); +void X509V3_string_free(X509V3_CTX *ctx, char *str); +void X509V3_section_free( X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section); +void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, + X509_REQ *req, X509_CRL *crl, int flags); + +int X509V3_add_value(const char *name, const char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_uchar(const char *name, const unsigned char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_bool(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint, + STACK_OF(CONF_VALUE) **extlist); +char * i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, ASN1_INTEGER *aint); +ASN1_INTEGER * s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, char *value); +char * i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint); +char * i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint); +int X509V3_EXT_add(X509V3_EXT_METHOD *ext); +int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist); +int X509V3_EXT_add_alias(int nid_to, int nid_from); +void X509V3_EXT_cleanup(void); + +X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext); +X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); +int X509V3_add_standard_extensions(void); +STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); +void *X509V3_EXT_d2i(X509_EXTENSION *ext); +void *X509V3_get_d2i(STACK_OF(X509_EXTENSION) *x, int nid, int *crit, int *idx); + + +X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); +int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, int crit, unsigned long flags); + +char *hex_to_string(unsigned char *buffer, long len); +unsigned char *string_to_hex(char *str, long *len); +int name_cmp(const char *name, const char *cmp); + +void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent, + int ml); +int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, int indent); +int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); + +int X509V3_extensions_print(BIO *out, char *title, STACK_OF(X509_EXTENSION) *exts, unsigned long flag, int indent); + +int X509_check_ca(X509 *x); +int X509_check_purpose(X509 *x, int id, int ca); +int X509_supported_extension(X509_EXTENSION *ex); +int X509_PURPOSE_set(int *p, int purpose); +int X509_check_issued(X509 *issuer, X509 *subject); +int X509_PURPOSE_get_count(void); +X509_PURPOSE * X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_by_sname(char *sname); +int X509_PURPOSE_get_by_id(int id); +int X509_PURPOSE_add(int id, int trust, int flags, + int (*ck)(const X509_PURPOSE *, const X509 *, int), + char *name, char *sname, void *arg); +char *X509_PURPOSE_get0_name(X509_PURPOSE *xp); +char *X509_PURPOSE_get0_sname(X509_PURPOSE *xp); +int X509_PURPOSE_get_trust(X509_PURPOSE *xp); +void X509_PURPOSE_cleanup(void); +int X509_PURPOSE_get_id(X509_PURPOSE *); + +STACK *X509_get1_email(X509 *x); +STACK *X509_REQ_get1_email(X509_REQ *x); +void X509_email_free(STACK *sk); + +ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); +ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); +int a2i_ipadd(unsigned char *ipout, const char *ipasc); +int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE)*dn_sk, + unsigned long chtype); + +void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent); + +#ifndef OPENSSL_NO_RFC3779 + +typedef struct ASRange_st { + ASN1_INTEGER *min, *max; +} ASRange; + +#define ASIdOrRange_id 0 +#define ASIdOrRange_range 1 + +typedef struct ASIdOrRange_st { + int type; + union { + ASN1_INTEGER *id; + ASRange *range; + } u; +} ASIdOrRange; + +typedef STACK_OF(ASIdOrRange) ASIdOrRanges; +DECLARE_STACK_OF(ASIdOrRange) + +#define ASIdentifierChoice_inherit 0 +#define ASIdentifierChoice_asIdsOrRanges 1 + +typedef struct ASIdentifierChoice_st { + int type; + union { + ASN1_NULL *inherit; + ASIdOrRanges *asIdsOrRanges; + } u; +} ASIdentifierChoice; + +typedef struct ASIdentifiers_st { + ASIdentifierChoice *asnum, *rdi; +} ASIdentifiers; + +DECLARE_ASN1_FUNCTIONS(ASRange) +DECLARE_ASN1_FUNCTIONS(ASIdOrRange) +DECLARE_ASN1_FUNCTIONS(ASIdentifierChoice) +DECLARE_ASN1_FUNCTIONS(ASIdentifiers) + + +typedef struct IPAddressRange_st { + ASN1_BIT_STRING *min, *max; +} IPAddressRange; + +#define IPAddressOrRange_addressPrefix 0 +#define IPAddressOrRange_addressRange 1 + +typedef struct IPAddressOrRange_st { + int type; + union { + ASN1_BIT_STRING *addressPrefix; + IPAddressRange *addressRange; + } u; +} IPAddressOrRange; + +typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges; +DECLARE_STACK_OF(IPAddressOrRange) + +#define IPAddressChoice_inherit 0 +#define IPAddressChoice_addressesOrRanges 1 + +typedef struct IPAddressChoice_st { + int type; + union { + ASN1_NULL *inherit; + IPAddressOrRanges *addressesOrRanges; + } u; +} IPAddressChoice; + +typedef struct IPAddressFamily_st { + ASN1_OCTET_STRING *addressFamily; + IPAddressChoice *ipAddressChoice; +} IPAddressFamily; + +typedef STACK_OF(IPAddressFamily) IPAddrBlocks; +DECLARE_STACK_OF(IPAddressFamily) + +DECLARE_ASN1_FUNCTIONS(IPAddressRange) +DECLARE_ASN1_FUNCTIONS(IPAddressOrRange) +DECLARE_ASN1_FUNCTIONS(IPAddressChoice) +DECLARE_ASN1_FUNCTIONS(IPAddressFamily) + +/* + * API tag for elements of the ASIdentifer SEQUENCE. + */ +#define V3_ASID_ASNUM 0 +#define V3_ASID_RDI 1 + +/* + * AFI values, assigned by IANA. It'd be nice to make the AFI + * handling code totally generic, but there are too many little things + * that would need to be defined for other address families for it to + * be worth the trouble. + */ +#define IANA_AFI_IPV4 1 +#define IANA_AFI_IPV6 2 + +/* + * Utilities to construct and extract values from RFC3779 extensions, + * since some of the encodings (particularly for IP address prefixes + * and ranges) are a bit tedious to work with directly. + */ +int v3_asid_add_inherit(ASIdentifiers *asid, int which); +int v3_asid_add_id_or_range(ASIdentifiers *asid, int which, + ASN1_INTEGER *min, ASN1_INTEGER *max); +int v3_addr_add_inherit(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi); +int v3_addr_add_prefix(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *a, const int prefixlen); +int v3_addr_add_range(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *min, unsigned char *max); +unsigned v3_addr_get_afi(const IPAddressFamily *f); +int v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi, + unsigned char *min, unsigned char *max, + const int length); + +/* + * Canonical forms. + */ +int v3_asid_is_canonical(ASIdentifiers *asid); +int v3_addr_is_canonical(IPAddrBlocks *addr); +int v3_asid_canonize(ASIdentifiers *asid); +int v3_addr_canonize(IPAddrBlocks *addr); + +/* + * Tests for inheritance and containment. + */ +int v3_asid_inherits(ASIdentifiers *asid); +int v3_addr_inherits(IPAddrBlocks *addr); +int v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b); +int v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b); + +/* + * Check whether RFC 3779 extensions nest properly in chains. + */ +int v3_asid_validate_path(X509_STORE_CTX *); +int v3_addr_validate_path(X509_STORE_CTX *); +int v3_asid_validate_resource_set(STACK_OF(X509) *chain, + ASIdentifiers *ext, + int allow_inheritance); +int v3_addr_validate_resource_set(STACK_OF(X509) *chain, + IPAddrBlocks *ext, + int allow_inheritance); + +#endif /* OPENSSL_NO_RFC3779 */ + +/* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_X509V3_strings(void); + +/* Error codes for the X509V3 functions. */ + +/* Function codes. */ +#define X509V3_F_ASIDENTIFIERCHOICE_CANONIZE 156 +#define X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL 157 +#define X509V3_F_COPY_EMAIL 122 +#define X509V3_F_COPY_ISSUER 123 +#define X509V3_F_DO_DIRNAME 144 +#define X509V3_F_DO_EXT_CONF 124 +#define X509V3_F_DO_EXT_I2D 135 +#define X509V3_F_DO_EXT_NCONF 151 +#define X509V3_F_DO_I2V_NAME_CONSTRAINTS 148 +#define X509V3_F_HEX_TO_STRING 111 +#define X509V3_F_I2S_ASN1_ENUMERATED 121 +#define X509V3_F_I2S_ASN1_IA5STRING 149 +#define X509V3_F_I2S_ASN1_INTEGER 120 +#define X509V3_F_I2V_AUTHORITY_INFO_ACCESS 138 +#define X509V3_F_NOTICE_SECTION 132 +#define X509V3_F_NREF_NOS 133 +#define X509V3_F_POLICY_SECTION 131 +#define X509V3_F_PROCESS_PCI_VALUE 150 +#define X509V3_F_R2I_CERTPOL 130 +#define X509V3_F_R2I_PCI 155 +#define X509V3_F_S2I_ASN1_IA5STRING 100 +#define X509V3_F_S2I_ASN1_INTEGER 108 +#define X509V3_F_S2I_ASN1_OCTET_STRING 112 +#define X509V3_F_S2I_ASN1_SKEY_ID 114 +#define X509V3_F_S2I_SKEY_ID 115 +#define X509V3_F_STRING_TO_HEX 113 +#define X509V3_F_SXNET_ADD_ID_ASC 125 +#define X509V3_F_SXNET_ADD_ID_INTEGER 126 +#define X509V3_F_SXNET_ADD_ID_ULONG 127 +#define X509V3_F_SXNET_GET_ID_ASC 128 +#define X509V3_F_SXNET_GET_ID_ULONG 129 +#define X509V3_F_V2I_ASIDENTIFIERS 158 +#define X509V3_F_V2I_ASN1_BIT_STRING 101 +#define X509V3_F_V2I_AUTHORITY_INFO_ACCESS 139 +#define X509V3_F_V2I_AUTHORITY_KEYID 119 +#define X509V3_F_V2I_BASIC_CONSTRAINTS 102 +#define X509V3_F_V2I_CRLD 134 +#define X509V3_F_V2I_EXTENDED_KEY_USAGE 103 +#define X509V3_F_V2I_GENERAL_NAMES 118 +#define X509V3_F_V2I_GENERAL_NAME_EX 117 +#define X509V3_F_V2I_IPADDRBLOCKS 159 +#define X509V3_F_V2I_ISSUER_ALT 153 +#define X509V3_F_V2I_NAME_CONSTRAINTS 147 +#define X509V3_F_V2I_POLICY_CONSTRAINTS 146 +#define X509V3_F_V2I_POLICY_MAPPINGS 145 +#define X509V3_F_V2I_SUBJECT_ALT 154 +#define X509V3_F_V3_ADDR_VALIDATE_PATH_INTERNAL 160 +#define X509V3_F_V3_GENERIC_EXTENSION 116 +#define X509V3_F_X509V3_ADD1_I2D 140 +#define X509V3_F_X509V3_ADD_VALUE 105 +#define X509V3_F_X509V3_EXT_ADD 104 +#define X509V3_F_X509V3_EXT_ADD_ALIAS 106 +#define X509V3_F_X509V3_EXT_CONF 107 +#define X509V3_F_X509V3_EXT_I2D 136 +#define X509V3_F_X509V3_EXT_NCONF 152 +#define X509V3_F_X509V3_GET_SECTION 142 +#define X509V3_F_X509V3_GET_STRING 143 +#define X509V3_F_X509V3_GET_VALUE_BOOL 110 +#define X509V3_F_X509V3_PARSE_LIST 109 +#define X509V3_F_X509_PURPOSE_ADD 137 +#define X509V3_F_X509_PURPOSE_SET 141 + +/* Reason codes. */ +#define X509V3_R_BAD_IP_ADDRESS 118 +#define X509V3_R_BAD_OBJECT 119 +#define X509V3_R_BN_DEC2BN_ERROR 100 +#define X509V3_R_BN_TO_ASN1_INTEGER_ERROR 101 +#define X509V3_R_DIRNAME_ERROR 149 +#define X509V3_R_DUPLICATE_ZONE_ID 133 +#define X509V3_R_ERROR_CONVERTING_ZONE 131 +#define X509V3_R_ERROR_CREATING_EXTENSION 144 +#define X509V3_R_ERROR_IN_EXTENSION 128 +#define X509V3_R_EXPECTED_A_SECTION_NAME 137 +#define X509V3_R_EXTENSION_EXISTS 145 +#define X509V3_R_EXTENSION_NAME_ERROR 115 +#define X509V3_R_EXTENSION_NOT_FOUND 102 +#define X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED 103 +#define X509V3_R_EXTENSION_VALUE_ERROR 116 +#define X509V3_R_ILLEGAL_EMPTY_EXTENSION 151 +#define X509V3_R_ILLEGAL_HEX_DIGIT 113 +#define X509V3_R_INCORRECT_POLICY_SYNTAX_TAG 152 +#define X509V3_R_INVALID_ASNUMBER 160 +#define X509V3_R_INVALID_ASRANGE 161 +#define X509V3_R_INVALID_BOOLEAN_STRING 104 +#define X509V3_R_INVALID_EXTENSION_STRING 105 +#define X509V3_R_INVALID_INHERITANCE 162 +#define X509V3_R_INVALID_IPADDRESS 163 +#define X509V3_R_INVALID_NAME 106 +#define X509V3_R_INVALID_NULL_ARGUMENT 107 +#define X509V3_R_INVALID_NULL_NAME 108 +#define X509V3_R_INVALID_NULL_VALUE 109 +#define X509V3_R_INVALID_NUMBER 140 +#define X509V3_R_INVALID_NUMBERS 141 +#define X509V3_R_INVALID_OBJECT_IDENTIFIER 110 +#define X509V3_R_INVALID_OPTION 138 +#define X509V3_R_INVALID_POLICY_IDENTIFIER 134 +#define X509V3_R_INVALID_PROXY_POLICY_SETTING 153 +#define X509V3_R_INVALID_PURPOSE 146 +#define X509V3_R_INVALID_SAFI 164 +#define X509V3_R_INVALID_SECTION 135 +#define X509V3_R_INVALID_SYNTAX 143 +#define X509V3_R_ISSUER_DECODE_ERROR 126 +#define X509V3_R_MISSING_VALUE 124 +#define X509V3_R_NEED_ORGANIZATION_AND_NUMBERS 142 +#define X509V3_R_NO_CONFIG_DATABASE 136 +#define X509V3_R_NO_ISSUER_CERTIFICATE 121 +#define X509V3_R_NO_ISSUER_DETAILS 127 +#define X509V3_R_NO_POLICY_IDENTIFIER 139 +#define X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED 154 +#define X509V3_R_NO_PUBLIC_KEY 114 +#define X509V3_R_NO_SUBJECT_DETAILS 125 +#define X509V3_R_ODD_NUMBER_OF_DIGITS 112 +#define X509V3_R_OPERATION_NOT_DEFINED 148 +#define X509V3_R_OTHERNAME_ERROR 147 +#define X509V3_R_POLICY_LANGUAGE_ALREADTY_DEFINED 155 +#define X509V3_R_POLICY_PATH_LENGTH 156 +#define X509V3_R_POLICY_PATH_LENGTH_ALREADTY_DEFINED 157 +#define X509V3_R_POLICY_SYNTAX_NOT_CURRENTLY_SUPPORTED 158 +#define X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY 159 +#define X509V3_R_SECTION_NOT_FOUND 150 +#define X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS 122 +#define X509V3_R_UNABLE_TO_GET_ISSUER_KEYID 123 +#define X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT 111 +#define X509V3_R_UNKNOWN_EXTENSION 129 +#define X509V3_R_UNKNOWN_EXTENSION_NAME 130 +#define X509V3_R_UNKNOWN_OPTION 120 +#define X509V3_R_UNSUPPORTED_OPTION 117 +#define X509V3_R_USER_TOO_LONG 132 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mswin32/OpenSSL/lib/libeay32.lib b/mswin32/OpenSSL/lib/libeay32.lib new file mode 100644 index 0000000000000000000000000000000000000000..1cde70607321ba39539c2e95db76adda84610c42 GIT binary patch literal 664514 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 literal 0 HcmV?d00001 diff --git a/mswin32/OpenSSL/lib/ssleay32.lib b/mswin32/OpenSSL/lib/ssleay32.lib new file mode 100644 index 0000000000000000000000000000000000000000..f7f1c1c24061a540011e8e54456f61cd18693106 GIT binary patch literal 52184 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 mswin32\OpenSSL\bin + \OpenSSL\include -> mswin32\OpenSSL\include + \OpenSSL\lib -> mswin32\OpenSSL\lib + diff --git a/mswin32/nmap.rc b/mswin32/nmap.rc index 00454bc6a..a9e379fb9 100644 --- a/mswin32/nmap.rc +++ b/mswin32/nmap.rc @@ -12,7 +12,7 @@ // VS_VERSION_INFO VERSIONINFO -FILEVERSION 4,23,0,3 +FILEVERSION 4,62,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x21L @@ -29,7 +29,7 @@ BEGIN BEGIN VALUE "CompanyName", "Insecure.Org\0" VALUE "FileDescription", "Nmap\0" - VALUE "FileVersion", "4.23RC3\0" + VALUE "FileVersion", "4.62\0" VALUE "InternalName", "Nmap\0" VALUE "LegalCopyright", "Copyright (c) Insecure.Com LLC (fyodor@insecure.org)\0" VALUE "LegalTrademarks", "NMAP\0" diff --git a/mswin32/nmap.vcproj b/mswin32/nmap.vcproj index 00b250601..be0968140 100644 --- a/mswin32/nmap.vcproj +++ b/mswin32/nmap.vcproj @@ -44,7 +44,7 @@ diff --git a/mswin32/nsis/Nmap.nsi b/mswin32/nsis/Nmap.nsi index e82e31ead..6785d5708 100644 --- a/mswin32/nsis/Nmap.nsi +++ b/mswin32/nsis/Nmap.nsi @@ -23,8 +23,8 @@ ;Get installation folder from registry if available InstallDirRegKey HKCU "Software\Nmap" "" - !define VERSION "4.23RC3" - VIProductVersion "4.23.0.3" + !define VERSION "4.62" + VIProductVersion "4.62.0.0" VIAddVersionKey /LANG=1033 "FileVersion" "${VERSION}" VIAddVersionKey /LANG=1033 "ProductName" "Nmap" VIAddVersionKey /LANG=1033 "CompanyName" "Insecure.org" @@ -152,6 +152,8 @@ Section "Nmap Core Files" SecCore File ..\..\docs\nmap.xsl File ..\nmap_performance.reg File ..\..\README-WIN32 + File libeay32.dll + File ssleay32.dll File /r /x mswin32 /x .svn ..\..\scripts File /r /x mswin32 /x .svn ..\Release\nselib File /r /x mswin32 /x .svn ..\Release\nselib-bin @@ -267,6 +269,8 @@ Section "Uninstall" Delete "$INSTDIR\nmap_performance.reg" Delete "$INSTDIR\README-WIN32" Delete "$INSTDIR\icon1.ico" + Delete "$INSTDIR\libeay32.dll" + Delete "$INSTDIR\ssleay32.dll" Delete "$INSTDIR\winpcap-nmap*.exe" ;Delete specific subfolders (NB: custom scripts in scripts folder will be lost) RMDir /r "$INSTDIR\nselib" diff --git a/nmap_winconfig.h b/nmap_winconfig.h index 28b33cb2f..bee084c01 100644 --- a/nmap_winconfig.h +++ b/nmap_winconfig.h @@ -111,6 +111,7 @@ #define NMAP_PLATFORM "i686-pc-windows-windows" #define NMAPDATADIR "c:\\nmap" /* FIXME: I really need to make this dynamic */ +#define HAVE_OPENSSL 1 /* Apparently __func__ isn't yet supported */ #define __func__ __FUNCTION__

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