From 350578d400049886067868e3dec186b06bc39c07 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Sun, 11 Apr 2004 20:46:22 +0000 Subject: [PATCH] added libtommath-0.30 --- bn.ilg | 6 +- bn.ind | 100 +- bn.pdf | Bin 298166 -> 320564 bytes bn.tex | 572 ++- bn_fast_s_mp_sqr.c | 3 +- bn_mp_cnt_lsb.c | 16 +- bn_mp_exteuclid.c | 138 +- bn_mp_fwrite.c | 2 +- bn_mp_get_int.c | 39 + bn_mp_grow.c | 2 +- bn_mp_init.c | 2 +- bn_mp_init_set.c | 26 + bn_mp_init_set_int.c | 25 + bn_mp_init_size.c | 2 +- bn_mp_is_square.c | 103 + bn_mp_karatsuba_mul.c | 5 +- bn_mp_karatsuba_sqr.c | 5 +- bn_mp_mod.c | 3 +- bn_mp_n_root.c | 2 +- bn_mp_neg.c | 2 +- bn_mp_prime_random.c | 74 - bn_mp_prime_random_ex.c | 118 + bn_mp_reduce_2k.c | 10 +- bn_mp_shrink.c | 2 +- bn_mp_sqrt.c | 75 + bn_mp_toom_mul.c | 3 +- bn_mp_toradix_n.c | 83 + bn_s_mp_sqr.c | 4 +- changes.txt | 93 +- demo/demo.c | 245 +- etc/mont.c | 92 +- etclib/poly.c | 302 -- etclib/poly.h | 73 - logs/add.log | 32 +- logs/addsub.png | Bin 6769 -> 7084 bytes logs/expt.log | 7 + logs/expt.png | Bin 7393 -> 7439 bytes logs/expt_2k.log | 6 + logs/expt_dr.log | 7 + logs/graphs.dem | 2 +- logs/index.html | 46 +- logs/invmod.log | 64 +- logs/invmod.png | Bin 5734 -> 5735 bytes logs/k7/index.html | 46 +- logs/mult.log | 50 +- logs/mult.png | Bin 8199 -> 8100 bytes logs/mult_kara.log | 50 +- logs/p4/index.html | 46 +- logs/sqr.log | 50 +- logs/sqr_kara.log | 50 +- logs/sub.log | 32 +- makefile | 26 +- makefile.bcc | 5 +- makefile.cygwin_dll | 3 +- makefile.msvc | 3 +- mtest/logtab.h | 40 +- mtest/mpi-config.h | 172 +- mtest/mpi.c | 7962 +++++++++++++++++++-------------------- mtest/mtest.c | 2 +- pics/makefile~ | 35 - poster.pdf | Bin 40822 -> 40819 bytes pre_gen/mpi.c | 664 +++- tommath.h | 70 +- tommath.pdf | Bin 1324173 -> 1153705 bytes tommath.src | 23 +- tommath.tex | 1211 +++--- 66 files changed, 7073 insertions(+), 5858 deletions(-) create mode 100644 bn_mp_get_int.c create mode 100644 bn_mp_init_set.c create mode 100644 bn_mp_init_set_int.c create mode 100644 bn_mp_is_square.c delete mode 100644 bn_mp_prime_random.c create mode 100644 bn_mp_prime_random_ex.c create mode 100644 bn_mp_sqrt.c create mode 100644 bn_mp_toradix_n.c delete mode 100644 etclib/poly.c delete mode 100644 etclib/poly.h delete mode 100644 pics/makefile~ diff --git a/bn.ilg b/bn.ilg index 89badbc..3c859f0 100644 --- a/bn.ilg +++ b/bn.ilg @@ -1,6 +1,6 @@ This is makeindex, version 2.14 [02-Oct-2002] (kpathsea + Thai support). -Scanning input file bn.idx....done (57 entries accepted, 0 rejected). -Sorting entries....done (342 comparisons). -Generating output file bn.ind....done (60 lines written, 0 warnings). +Scanning input file bn.idx....done (79 entries accepted, 0 rejected). +Sorting entries....done (511 comparisons). +Generating output file bn.ind....done (82 lines written, 0 warnings). Output written in bn.ind. Transcript written in bn.ilg. diff --git a/bn.ind b/bn.ind index 451128c..ae1dcde 100644 --- a/bn.ind +++ b/bn.ind @@ -1,60 +1,82 @@ \begin{theindex} - \item mp\_add, \hyperpage{23} - \item mp\_and, \hyperpage{23} + \item mp\_add, \hyperpage{25} + \item mp\_add\_d, \hyperpage{48} + \item mp\_and, \hyperpage{25} \item mp\_clear, \hyperpage{7} \item mp\_clear\_multi, \hyperpage{8} - \item mp\_cmp, \hyperpage{18} - \item mp\_cmp\_d, \hyperpage{20} - \item mp\_cmp\_mag, \hyperpage{17} - \item mp\_div, \hyperpage{29} - \item mp\_div\_2, \hyperpage{21} - \item mp\_div\_2d, \hyperpage{22} - \item MP\_EQ, \hyperpage{17} + \item mp\_cmp, \hyperpage{20} + \item mp\_cmp\_d, \hyperpage{21} + \item mp\_cmp\_mag, \hyperpage{19} + \item mp\_div, \hyperpage{26} + \item mp\_div\_2, \hyperpage{22} + \item mp\_div\_2d, \hyperpage{24} + \item mp\_div\_d, \hyperpage{48} + \item mp\_dr\_reduce, \hyperpage{36} + \item mp\_dr\_setup, \hyperpage{36} + \item MP\_EQ, \hyperpage{18} \item mp\_error\_to\_string, \hyperpage{6} - \item mp\_expt\_d, \hyperpage{31} - \item mp\_exptmod, \hyperpage{31} - \item mp\_exteuclid, \hyperpage{39} - \item mp\_gcd, \hyperpage{39} + \item mp\_expt\_d, \hyperpage{39} + \item mp\_exptmod, \hyperpage{39} + \item mp\_exteuclid, \hyperpage{47} + \item mp\_gcd, \hyperpage{47} + \item mp\_get\_int, \hyperpage{16} \item mp\_grow, \hyperpage{12} - \item MP\_GT, \hyperpage{17} + \item MP\_GT, \hyperpage{18} \item mp\_init, \hyperpage{7} \item mp\_init\_copy, \hyperpage{9} \item mp\_init\_multi, \hyperpage{8} + \item mp\_init\_set, \hyperpage{17} + \item mp\_init\_set\_int, \hyperpage{17} \item mp\_init\_size, \hyperpage{10} \item mp\_int, \hyperpage{6} - \item mp\_invmod, \hyperpage{40} - \item mp\_jacobi, \hyperpage{40} - \item mp\_lcm, \hyperpage{39} - \item mp\_lshd, \hyperpage{23} - \item MP\_LT, \hyperpage{17} + \item mp\_invmod, \hyperpage{48} + \item mp\_jacobi, \hyperpage{48} + \item mp\_lcm, \hyperpage{47} + \item mp\_lshd, \hyperpage{24} + \item MP\_LT, \hyperpage{18} \item MP\_MEM, \hyperpage{5} - \item mp\_mul, \hyperpage{25} - \item mp\_mul\_2, \hyperpage{21} - \item mp\_mul\_2d, \hyperpage{22} - \item mp\_n\_root, \hyperpage{31} - \item mp\_neg, \hyperpage{24} + \item mp\_mod, \hyperpage{31} + \item mp\_mod\_d, \hyperpage{48} + \item mp\_montgomery\_calc\_normalization, \hyperpage{34} + \item mp\_montgomery\_reduce, \hyperpage{33} + \item mp\_montgomery\_setup, \hyperpage{33} + \item mp\_mul, \hyperpage{27} + \item mp\_mul\_2, \hyperpage{22} + \item mp\_mul\_2d, \hyperpage{24} + \item mp\_mul\_d, \hyperpage{48} + \item mp\_n\_root, \hyperpage{40} + \item mp\_neg, \hyperpage{25} \item MP\_NO, \hyperpage{5} \item MP\_OKAY, \hyperpage{5} - \item mp\_or, \hyperpage{23} - \item mp\_prime\_fermat, \hyperpage{33} - \item mp\_prime\_is\_divisible, \hyperpage{33} - \item mp\_prime\_is\_prime, \hyperpage{34} - \item mp\_prime\_miller\_rabin, \hyperpage{33} - \item mp\_prime\_next\_prime, \hyperpage{34} - \item mp\_prime\_rabin\_miller\_trials, \hyperpage{34} - \item mp\_prime\_random, \hyperpage{35} - \item mp\_radix\_size, \hyperpage{37} - \item mp\_read\_radix, \hyperpage{37} - \item mp\_rshd, \hyperpage{23} + \item mp\_or, \hyperpage{25} + \item mp\_prime\_fermat, \hyperpage{41} + \item mp\_prime\_is\_divisible, \hyperpage{41} + \item mp\_prime\_is\_prime, \hyperpage{42} + \item mp\_prime\_miller\_rabin, \hyperpage{41} + \item mp\_prime\_next\_prime, \hyperpage{42} + \item mp\_prime\_rabin\_miller\_trials, \hyperpage{42} + \item mp\_prime\_random, \hyperpage{43} + \item mp\_prime\_random\_ex, \hyperpage{43} + \item mp\_radix\_size, \hyperpage{45} + \item mp\_read\_radix, \hyperpage{45} + \item mp\_read\_unsigned\_bin, \hyperpage{46} + \item mp\_reduce, \hyperpage{32} + \item mp\_reduce\_2k, \hyperpage{37} + \item mp\_reduce\_2k\_setup, \hyperpage{37} + \item mp\_reduce\_setup, \hyperpage{32} + \item mp\_rshd, \hyperpage{24} \item mp\_set, \hyperpage{15} \item mp\_set\_int, \hyperpage{16} \item mp\_shrink, \hyperpage{11} - \item mp\_sqr, \hyperpage{25} - \item mp\_sub, \hyperpage{23} - \item mp\_toradix, \hyperpage{37} + \item mp\_sqr, \hyperpage{29} + \item mp\_sub, \hyperpage{25} + \item mp\_sub\_d, \hyperpage{48} + \item mp\_to\_unsigned\_bin, \hyperpage{46} + \item mp\_toradix, \hyperpage{45} + \item mp\_unsigned\_bin\_size, \hyperpage{46} \item MP\_VAL, \hyperpage{5} - \item mp\_xor, \hyperpage{23} + \item mp\_xor, \hyperpage{25} \item MP\_YES, \hyperpage{5} \end{theindex} diff --git a/bn.pdf b/bn.pdf index 90e799b1361b45ed49efebf53dd309c09a8d134b..52421fd5981b12f134d6f2352d6c7d978f6ffb32 100644 GIT binary patch delta 248021 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Ⓢ1~iHK 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�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 U_#1Q-m3ViXTDNY?jt{5)AI(jrXaE2J literal 298166 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

b)%{fukLTe%2VN(#$zRgGlJ} z(0*)co{mI~$Fj0ItM}V^{GD}FsfAsyw;us2N=!u*YXYTRK;Phneg~)jXqL4suSs(E z#vN{m8z6C}(Zwr$>f5l9yio7&m2xiOQ=}XJK{OcQnAm1$vk7c zEd*uj{SdmMN#bViT2^B%&}<@1HF#CbaJ@p>aO6V`!Y)Hd)j#-mn;nju)P9{_rY5>$ zLSA+Rq0}1ba!hnm9PkewPiF zkV*{wNy)|pbTArQ`1+bwCd549IB*R~(iFD04IC2(hJ(5WCG2{b{6oS*cA>3{o+hAm zz(Qv@>gZcj(<;2FyUBw!_woIFz2E8PxPGaO^_+ZHN$M5t67_Jd$EWwHC@wGBbx%-} zqnvY%tum2=o3C=hyfUBtYDYW3>3XefgKU%85=%u&x>=NPs<^3emaE!EZA#iBmG*1r zpbfCyHRuYA{e07mC&b%Kt3Fvf!?wl**%=@WIYf*TP5GP=)7mgwvpG4rD0@tmbFEt{ zXItmUCh18e&0aoAS@@^(cao1r%4u8IhRX^iRaUH$K>L@6dsnMmH-(pDRcS;cM5!_y zk|u}!-zl6@{pr4$tD^HffqQ5pf;Z%cZ+iDrGkY}gguS{TJW}$=oq9aHN4CGhE$!rK;I9K2O66TX6N94D?lw5;+^}Nmc4TR&g=Hcc}bo19^2gO-zvG0_A znPCxVL#wr^;GW7BDSK>3cwDqE=Q!nl1{gjB#UMn zhw;-vD?X1aFey_8ituw^GN1{}ON{M=P|`quKFBN(xnf)^dOCMnKwe1U_Nqt>({j-k zG88%i3*ph)(~*y%*IMk7bF>}{I(%ez9S_Pxki=fNSp=-i8^)N4qk>Rh)qP`c

#x z9rd4iH`o|sD@WRjHLK{JDTW=9YQVdCcOL2~vaN+2@9#(E+Z8|!=1J(gAE`e#6cG(8 zpS4no575+=Bx8V7nM^!|Q!TJ%kLjS=ke917yOvzNG8Xn9LiV2^C0p#gSU^8_ zmqwGNntgv#NgG%<{)Xaoq51$wZk%%()46PZ@4Z)ezO^(O@H%M2=Q?V9qe2Ap=4(T9 zPU9}7Jgw4u$Su+n=Zrv)6`=x)$k-Vebq5-SjiHSzDlJBI8~YgP3U9E_1Rdn8ZLuzO zN31_{{jmx2V~b~iLPyQ(+Z+-8chD7P_?!l`>*1{`X$kkn$$>%39PIt>`TGo1VT|ut z*iUx;BO)okVpk;1q#w)0j+|l^LGo}b z@D3C;chVcHGz}a z!!`4!QW1kcvM@<@%Ty&H|4HHjHXe0gXJ9cMU6lWU#}l38iECYD4g67hUIQRrbsrtA zwls7GVaCW-y2E-S#&%pYcD_v#AX7@|sT^7R!cRUGa^ArqNt2=+r7n(By@z`L~sVS3%Xl+~2BkKda6peJ)Zl09 zS7E9Y?u)myf!o||(ac=@wt@=&$9R76LI$bu1+%o0!|meEh)R04Of%DCnW)@U62fdzsvthGA%?^7 zC^O(frG_%P>cW6i+^-u08pwG|pV$8ST<=k_5_pI~;PCuQHzsPQ3N~N36ry6?DbIDs z+Qxjc1m0SoNId8>2%*xwy`_RD*2;}awpk> z5&0_HxbOkd+>F&Vwfhg`y3QpQ(6A}HIy!5Rbmtu7$H6dv4IhfU1*kxYToAB4w%M&a z2ggQ+D-;SyOLK{EDh$_KGpeE{yLuhpu0^~S$u_j@R~7XMI%tv%eK8+KHuZ%NpX zeWxZSDAv}eN+B|RX2 zrus>avR$4Q&v$Xx0!`j zc;bdBeM384ra9>)iEE98Fn|Drcgxdamd4P`w`m7cPyaj&Z+CgXOacpA<$H?MDZpDS zRWo99++_JR=g#a{*j45)J#Q-#VD6YW0HPg$2xWVjuk^IYnWz5a5pHCiezDGsj|?jV zdS_TcyM;8Yf%Hu;Dar6xY^A z#yz9xH^Heh+rYmlrft7Hb&8-38fPA*&0JNBy}r$(OhXC1$f% zDh(*!=hH#qxp0HCg)O>b8zLE! zt*&8J$!8XaFFBKUL}omL8>D5s24zA%lvBm~#UE>w^1ee#%vfC5RF?ULY0bjEO@708ANXI5q-sxD2Jwn2)p-vD{SC7;Ub4#1K)UD=Wknu z+}&BtpH03m&^f|;XlYQh%JH1)uP)p{rv}gvmQ+>h%=n}_)bfq@S)fFGua;5fzfJ=w zEg6LIRR)b$)A2~}d>wD>L${1MWj6ug7Gd zP9dCMT_Gl_IWj24e*1Vhj$OvxLF-qL*ET@S0T#%iBz;}LuJMQkuQ)c)_CA1mW`dv# zM{rrH=ZCTcv9yOo^%!-7t4|p3{?4VY6#C|ts*f>YZ;oJ)J{%PU9s}*PP*C2xG9a^` zj3K)G??qg~>O1_du)DfU`sjOtHy*?NyQQKPkZ3I|Xb93vP?NFR)BXu6vkFbne%dp@ zH9;1L&ZnDaXQ~oaPrL|^w+gvOBi;8ptU*bBd%(gG4M|cf4Oh{QRO5@njPu+C6?ESp zBuqebnq`FAufF5HrCx~)6r0Vf0zYzp2T)#n?b>#fi`nyc#kVUcZmt-_1CD;*h#9mV zbMo)R_1D3Wbk$H^rZYmV#MPeFl{VxIhOslq*UOT3cZ7lQRrjBtD}JQR+ycskf)(QJ zW#YhJ!oa$~U%QL@rZAhubk;gj--Me2em|a>-xC8c*~2 zd+}1Ftk!rD)_j9(>yzRon`=N!NCcxkPOkk-S98DV5|XpfD#CQKt!Lqx*@*M?j8pP- z$R3XL#{iSxU|`!Xqi4yDwJvl2Z)u3xT2Q8S(0b4>M>;&eVs?gC^>vS~S}k8b<~2f> z(G)8$)>(`^M;-kp=jMa_$fTxMzo%99XQoSTVNS|E5k5=w401j0S2xKQlZ>|GgVC5@ zB8EA@6o2@e+xhbzy!r)|Y^b9EsPWUn`1Z=C9tI{h&C8b+Pozf+!AvLmwg} zaV(U!rJyN}oshz0m(hAgK@TT^B~L(JOELbCDi?#E?KgqYwbyKs;Y`J_NL%Hj+@Omc65`cv$*Z*4DL7=bh58Xp zSt{Y&-ULK9lR*zesTyB@fi{(U(GlgD$hqwwecK%IPv0)|PzPSX)GDvAf}3Qx z9`l^XWIgTMm`Lu`0ptDq*+L(}bNhZSHjOb*(kZy9SL(c==buV@FJ<+emwS1B>L(pR zfXYemY0$iqFeM|{^R){1kG?p#l(B1r$-A%eNJ?3^^YiU#>k{~qs%^804HfhjaXIJC z6x6*{lBo=1)>lsl%S2g0P!kr!dh-V%@BxlhKG4WWt|G?hv`&1E?NxDS z@lZ@ez_G}Y$0uGqAIWv+aK*a(1eeF;qd+(hQ)IGL#m-ltiOB)IHVWnXQsc}!m8XaK zXJ|OJ{a9k>C@y?GW=f>Tl+z0Q777+Vl~K%hc*uO7l#I1)YwIi%cV#1dIv7#U4Zz=A z@Af}lp<)p;jX2yHSWP#| zvpWd9=#>xL{MK>qzLkk%L1*3_T2JCtr zN<4o~4GX&+xBGKbwx?+Ax8!ozN$~2-aG8h}?7Ju8slI?#N)>WhzSAnDop8(YKb%4N zmUcSxS@o%mIFPZ`J}!Sk}XNC-!~gLeL^>rxQ6Y}y}4AS z_W^;Eubn1>ssT^OZ4!ok5&4XNC_9p4u>gT4vp1#Q+O;+uaE72xgn_fb&^JCxf9Bxs zdIeY%lGMrjFOJT{aXE>(5Jbk+T<>|3$4pp{& z5yI7GxzI-BT+h%2Juz1=d7U@EJN)i4*_meyfI%CAD=IKE6k74v2JHd6PxdS7$2Q&F z$SRPBZlbmP;62~u=Tm!0U38nzZZm3w@8~_LagAWP!`ELv(R}S@$1KFho>s@1YLHx` zjWa~O;?Z$}_C4XfsFRsS-(~-9f3P17szfbzC#Z(Wx^p3m!UpCYStq%D`7o@O|Bfp~ zXQOOUTS`!y>yJtR!vS(}OH+9y+Q4i%o$9c3Pl<-xyuE&?k=qGPE1|I(w`#jFq8l4O z%6;%#bZeM2*4%v=lC)n z@C0@Uzy`I2kNbVI_}0Bgmc>Y8_EOrgwi#vG$`4rQ>&M;$*3lr zUrspuS&p~uY~BQc;PxPuqMTrh+9Z`d1E^?L-c{rQp+N$L+UKI z?tTjEpU_hkT0Y*awC{N-@QTo_&{+?@oq_lx1ZTMA49@L9(#Pk#&niZ z*|NcJV-=A|IMC0wQDdnjKi%W{P5ClrkZswJ#MbipW!4xyH)czYgcokbdX-y2_gV-L;=cpz_MkBGOVu{Djqld6$~WN z@Ry}%5hPv> zL#$dYv_bPG4H)Q*mOvI*3m#HxzYpSVt0#p3AN~Lf#!#uk5dTU8=KGB-%L&(gvMBni zRrdvD56YiwY$k=ggUA7u*4tlVG-m>xhU2sj&Xv=l3w4FZ7(?*{Yy2VU)A(`uPK7Hk zW-g9IzG$!xbJdJLNB+T(6cEP>Wp88z47Ap=uksB_dOMZk+JbWud6K6PXVJY&oVL<% zH&RvOeG1c>wWc;`8(b{8vDP$i#00AZ1}B`L2()HV_}3Z{q6JQ#Dhts6jZUQ#pX??81DViSYNdt_(bn@}B{L zrBtrdq`8nMEALu4?0c#wH|cYfcgGpLaalO>8B4C@3(Eweg=@5ZDc`OQgf!qMZ5Fqzsg!tJ+t%2o&ku?A&0V^rTmKMb5XK0WC zM*lJk74DE0GKn%rW8N|HLc zm*`-pQ9{X7zNw416xz-ny}GkDYz>-A)5Z|NJ6)>x?emB)z>T>ncwdoOYgcHRhsjm% z$IZ+>L3R#7SKjb`gq-uxU~kEKGM@X8ADNdpj*!_>nN6iwoElnm}M_Tgp{LMGX ze2~XoD=7Uv%nuFD2J5|2(Y6jA#`hLEKTBHUEYS4_B~+#EvA8+z;_<%2xD?8h|}_>H+S5!K;89 zl)rpBXePc*MOX9U8ikq%2Bi(&Agxj`Ll-M;um7BN@S1jL`;AZVfeSAcOG5A8BjZ(K z-`j;Qjgje7nPH^)M%xw=nr1=z+fyZEs2>O!9#5$mFY4oaBr!EkSI6h#@lSxBIC9Ce zkA4*Z_Mf9P>tZVT46lpW{icWI?1Y)@r?(2e3V}V^m6v+gYeC$)M=@2BsRJZB?r}A) zDdTa`giTBt7~2GW=gBO%krRG907`BBrsg{hex3d~6#&sMNt0Z~-meXWI2!AA>58mA z?WEs(zPTPsJt9X2;%Jf2G8}XV-09f8#yeZBPAw^9L}V|mHcOy&)q6QP+@=(xITYa) zM?U6IL&lesfRR6>Wg7cr=+`TrLo2mgbvFlaD{IM|UK0d4(3`mLiuJRoDdIY%TFh8= zru)(Ne4|nyhE>}q#CqWzZBADSNxI4H9wd_8>sJG%0x1=K$U6v!&c z%E$=hd=8pA$i75ED1O79*Li0teC^{NhseC!y|95uf z%TVgC_E?Ne|2?JPuMEn+(kI3?PWE)hX3j=*|1po?&m;mNy1!)+h|@{^#bitNi%5~D z`!kI|nNIaDY>LLeSZgu=K|%a0LGo7@d?-yuwm+S-SiaH%{$I;K_>VtIUl9xhY+t@x zY+s)+8!IybD?7uNuh!R#X8(&X*q67~pZNf+Uvvrw!&hFwAN{|M_D8=zwrpQ94lG}G z{C^q$)kaV7WyAkf{YSU2g_VKfpKSY?{u!G3JIKMp{sj*Gx%cG+#`Fh;^q;J@zUF2A z(`)OGpbX0|jE8_u#PSR05i&Bg`C$ab!vp2u_{H~FLAkD+Cn+nXk2V(DJ#MXlz+TYy ztV3d@515tPN!z-(Nc(?lZfoO&(g8T=!mPE-0hHcS-VL3FdpwZP^~NdU`P#C zP!3QZTkAm~KL-F}s;jGp2KW{~_Y81GZAs3|j5NWAT-^XHHUk2K0#JQ>TL;{)MFWUq z3E+$eDB}%CD~80^+cQ18yfOm?lbz&xtBOR&H->j)X=MxqM4sYX;rkHHF(!2efCXo~ zz*kKM%{Mjym;JGbObg(Y4L!9CYdYcII{`=E#0m^7<(IfXfU?l#xyOeF2e9GOdr%qm ziDeJW*~XU-aECC=1`wLt0z5QFhj0`rsoCe?0w( z#ZuGMc>8u~2ks%NNOS{@|yD_~=PTaJF{> z03Me<|5zUK`Dt4NsD>+@?nm%F`!~M)!)MfoC?lKi{K)Jy6vPYej^7V~DF1-xO9VRK z`QH=$zfW8O;k!>j9i5+Wx4^48eSJTTtwTYV-XGc7@_CjDhfqhj zf`2F3r%>n+4D7Z{TdBh)phN&>1AgJ4sT;Dg9pF_ zz85HfHVL-1Z+!cn6?VzDAXCZ5AwEQCY`DAsdH9mn!YODC|8$u|v)6G$*H|6g9^}gh zpN%;((;kqb7cFh>HH6Mv(mSl+3TA3I8qB_*I+4OU*Zteov@KR2lq|TxJma-CQWc}^ zstx7h*Ed?k3LbOAnIio3otcA7m-R>&ruI}ZM_R^sE*Bi#O)xxz#<@uyTsy%ssj8oz z;xjZSqdcd)W2yy7b8CWHIe{lLE@kHKq;$kjz?!;5>9 z#|jSyU&E_@O4g z@GZ-N%PnL9{~D4ICbu8Z7Ca!6v&}uI2X{u35bk_pnaoF!c9I%eO=}AZ$HmV+GURf! zeJ-!B>!vj=aNS<)dWl-LP?8&(@F&%N12K^gKFhncpNRliAF?UFu=c%azT(ae_Km}p z40!AKF&*l^k<7|aV+TdK(P*v^xD9wgNp=880QkfmoNR#L6*-wK=(qx>i4etZN$-zT zysIBXWM=p4UM0De1oanxrF=V;o`;5sDQlv=!fF7=L_97pLIXW+Vd3SD0jh=o!a768 zY?IZf`OUuCc&n3wTH}jUQLp1Po(;hrzKbwkJU|H*tHLwR~Xup`|TxybQ5B zS{VKEUh=v90be(4)DbAR*&#F7WSL?LWHDPPj%td>l1M%cPdO_1{C*VZ9`fT*^1|hi7?&Th^%g@pZ;}o*>ha3mgDzWW zTalo~)ulAU4rNd$MO6jqjY0z3Ol{mHD54?WTKX}@aTeB9cjq2vvASXxo&!~$-^at> zr?ku{`s|#w6?C6b*K_t$R!;6+1QJT74m|Lb^*V=Xou-4&|VhANJd5B~RKF9~p{W(p8HgMaFVu zI*Mt+&XN@0Njm(-Db?B1eXd+Yo7-WLW|uQ8Ps#FIY{EIZyK^PKaN9c?B|I25}0&rBmV$u`>G(n3iN`KMm!bwIGV7n(4Aj&zSqDjf!`ED z<`!%YeK$UoC>E z8F<;{m(}Y_$h9UbDj8dD&u?e+c-ZaF8M`k-G9}5q~swRE>WSqiaZV z^J27zh>q3khApuf3oP0n{*q+>%2m;)Js?PBDqq`*y@=8}hk8{$R<^w@%k*q0p`V_E z@tS4Iq*kdEd@?wGd7aLOr1nqdLVqFSl__uU7R6HI2DIdwRXW45Td9(#G?*1IHDk;e z*U={o7>B&o*p#0yiJniMgo#CFK1Ji|?L*+-yl>};6h>MG(d5rcY{%Ht@|Af&Y|FYg zG$9tA4E)gpiWwIk6Ps%J_yA$Iv82D~4I}dm3~)4;qkIn&iBWhw91-%oADWS&v<9h7<0F=&E?{7+l9LlQ~G4zd{V434ENefXQU+ zi(2+mv4}3n$coxqiajI{xs2lmEcHf$vO&2$OX_7$Gd~0&}oKhu%?)i#e+PB6vn#?*K zU^mK1a{xLdRcnjOwN@Jen{C2p;$xu_b}GK^(UkGHUs(+aQN}AkdI5hukRE}`@xpfP z{3J<>Dze9K<&k8UhzLNQRIAP0fTr?X8CImnT1r@HJt#oRT8IlVcAjnnmE9_Cs*^Ym zk9I*RZg#s9?A8`6aJno|S=jK+B7sY4lT?UwU~gApZh7i1dv~H8%x@Cja5Wgax?@?1 zP=ayvP)c}J)Q!L3Ca+{-ox*&Mn}O7ZYQ~evm0(fgg9v&jIc9nrdThVSN<+1G7ubdcgO0m2 z0Zq|@C;7Cz_EdSax?Q)03(i3@klT6>ms$bQ$XL_3Sqh9%*BB}d2FnkEuF$!I_d3VxIBwVNzy~cJFA3m z5k2dT>#|0Ja^hz>Jgouf$Yi$_pmSf(wMsJ-&@Bpu&i4;Us^T}jJ|WD<56;qBz%3`Y_h0xd z)$?%bEdjk6V#4=~usi*kV90U22o~n_PUg@uT}?*Lt~xo6tkq`uuLb0=Dy9db=q$Ji z79Egr_PbK%x7Y^1yhFTq+HMrv2Va<8@6}39LcB_Ky$3@BC9_=AwTrkj4GJbjd0I}F zh>sJ=%pW%vY=d068M>rTq*8Kh&dupZ>j;X?;M~thm%lSA>qlUd z=)jgrJGZ}TdbbgmaT!P*d>jrqzs}&z+`yoESNLt)Tr%94Y7er2YLJpX^$g$JJB=V# zR70N&do#^}IefAdk+&n<)*l`wWFCF-U7u~BodH`83sS^T=If_EJg=Q6xYf-9osW_! z*sj_`qEQHgPa>gEJRt!f%u?>?iH0&Ww4W$jb|~l-v@Mp)afWTyAj27%_(IK6tNEjc zbaue_SzTP0grUQSjI=3Q;fy^!^7|`|l==vgvs$bGHfJg>8^oDK90O zr3-Par)M%?9}c9L8A2k3AWOoaY=z!1p&0d*GZKvSQ>q7IwfZ-R3uG1OuE*6R0kS;I zFq}yB&U~q4y7xe(v{bI%s7Y&?e)0Uf+Mr?CCY^YLf*D)?@h+6kmMtua{K!6n5PcQw zF?oqqMhq z3z+AFS&EXI9dLTuTtrGn*{x#vk^?`{dr*k5VytbSoKw1tv&3M$9%~iVrfrVqSn~B| zM1J;)5tl?qH5#Lryz#ITU-RgP$du-N+%=Du=BtbN>;{D5+MU#xuG3Zd-hd=Z+t$)- z=y~DUrM;l&YrNE2>M9={oXCKGzpJP@QpM!R+}!O31glK6?lvfJ`rskG+sf6G8w;bK ze;{OA^o2z=*CL=!+s|l5mhee?>eKRW!^xVj(H@}P2E8sVS!9{n)x?0_L%3IE$Xv-| z;I!?0Bq$c;MJ9#Du(da0_3n_|8y57Z7*%P{%mShbXK1mEzhCX84OX>CR#$-Q`ai6_ zbx>r%n(d22S>?(XjH?hcK+HSUeOySux)ySuwPJo=nDGjr~p8*$^k_s1@FW$wz% zofHv^s^3~)?Y!3u3V2u;>odd;wrd$l%hb0uZ*$DBFp7~CoeN9jtxCNq1It|r&U*Sp5lB5Mc zd47iE-!Pv`)*Ffid~^c_nnbnex|z)Kp&>z%Kk7f=MrzJ3-3>&}ek01pV^^kc(qdjI zIs7mgdzqBET94Y)t4dwv_s>kCL;FpoVNZ#|y4P~fYt-KPK9W`bmOeOmEP5y}2&6?+ zdP|TT{T^ocfpAI?V{`+_lFCq}aLk|C9VYZ;V(KjJ+ z)t=s}mrx@sd|%cxh;pv!9s7o!sug9cXka#NJhn{Xj5KO_=N5ctERGl zya3UJMW(we*EHQ$lX8}$R`(X!gQ~c^a7A-peh!f7MK7G+LRS3#`Se1dj3hH#G*2z_ z;|fkqXzO4G;!-7fnVeBn9~LvyzhWidV)Y$4C4ek#cMo73#iO&G zM5SJ+@7pj!Uw>>w?wh?hCTtL}C?8hB6*=HcL@%zzUMQ!9m&w#AI=8np$cq#_g%7jm z-KYZ1y}EM?Ti`g1x1u+}@Ya_rktYdBLt6#{1}nbE7VvIPyB(;chWapf8gJC~nB_&J zB$J^wn^n51O9JARhruff5*PHG;6JXheQwMaMsk6Y>u1 z`B>#c5e~>hbA8bIgxAz-sVu5J608)}QCN2b6;b?Jd;o2==kNNf7Vk2G(W}H)+?2Xt zH*c2!O$8ra45(Q@wQ-?3K!ZQFTl4RJk+RIcHp#?VaYL$n7 zE3hzJ6N8x+Z8J&CmI=a}EXS#nySkqxJKSiVoMNq3a?kqy0>~x!0Cs4qGsw!XyG}jD z@)#_V`8B)0Qv{B9Coq9!iUFBpfGG@f;R(Vbd4qx~Nmt!7?&XikuUQ`DjC}s5|g|w#zpqFPc zxsd&F3+!s=JXNDs0Myi((H0fhm~?w$p|dz>?8vx}L-(pIO&Q6ym|Fv>!%x!m#zRCz zqpT=pO^+jN<7$D0gj{W)_yPM_7!e6f_G7fqX;Mu4FG;2O2HcFB8oFpB(Nt&6d2z@Z zv~W!QJieMjwoYU4ASObyuMmvSI($bTnO|O5q4)X4Xm7QgQ9P!4iYyj9^WN-GI7J)1 zs-Wk3zir(8_bQVEKat;4DK*j~2T0afb?}c5o?9N=csmc0c2e$=?C@2UsDUcx#nrTG zN;&Z*7kE{PC}KbK%m$?7XLHi+<&+{Fsm&@hy2)D>SY&vfv1;`Y_5zaKy3VQ9+5TWA z71?x<)SERFkUpV#GFs8p0pqu>&t5pQcRdU?g#BHiF!;E_coPpK(} z{1DCm7gPho8&}wxFp-V}$kMSS-xvu><1__EiO5tdT_*(1eGgAbiVLjeMd#4ht!gG{I>F7;Nqv}Pr5r&m;aUEN_jOA-3H8~<^n|1+j z&J;DS$RgdE{hgxg1EwP0Rr7RAPFtgIHg?ZP&3hzkzACM!-PFe8k^N<^3bkNM`Fzek z@^Sn;S3MtIHm%D`S9%m^kJXCv#8}}N>RnLY*-%yzfdhJ#+M29QP{7ctWV#`WKTS}}ZIB;jLqx?!4$SqgG9j*3q4`o027%i7H`ZDg zX+-069w8?r)4G}>GevAJaV1Sqtn*q*qyBJ_=Z#S(q8c;B@2={ZJ*ydcYc#&^j4;B5 zHceuo$rS0k3H94jZ+>a%5|(o?mEc| zQXV5B!$F8tD;S zq#@`;G(ULfRbk{G%3kys4;yZ$@L1ul+84_sEWJ0hnfbYJQm-4b90kjP9+cLB~WnyI>4a8_|U7T2sU>;fpSY_K&Irxqit>!RE2SQbxg7b68}nAl)D2|Je`Fah~@q0pZENCi~!H zpb1|f`6TI?b<08LQ2B}!y{*4bzEJcI&=C`Ts$}+DmBVv#UDLjNkA8e~aaq9TiN>-z zaqlw*3!62~@p_n3%bFMBc{&(C7=qetrOuy&Zb2RRfun(DLs?1uXW|p0pnY+nv4*yEFHn%NTdDAxDt46v_ ztHK9=O?|*LFgdyQ-GSiK3e3#?jz%?oHG;zPte%MZ52|M}m;P1jY>mmwVFTIN%(CJu z9p{k+Hiz;1rrrX{p3OW%NX8wmgFMZ)N75{;cz3*Q}}{L zUcOemd{}=GgaJ)+%x%K@?;BQhCKave67o|j%zfdETQZ`u-q~0=xV|+i2tVoT_Az|;p9@&}!B%D5MU#bNG zu~O8_*bKY7l6YCLKIrfa9jla^VE{VgDw%{wAJ&2o5oLvHKtv) zDU5BMJIt`a3ryLi0~jOU5+z3Rdb{jG(m(Vtq6QjE7&E!ST#y_gLrG$4I5d(rCzI%i z6l2AD#`M*bT6)!R^>_bVzjeJHKYp?>sy?@vKR$onN2>%zIj~;Srk~axt7o*Y(K`k#Q42S;VC~H=MCTnKJ4xj5*?S+2wf1 zhN43b4dtE9z-6$+Wtcv$eL&&UO}zI)cqGkGp8g2y(+=D7HJv22^^x8Rxf7}xhrik7 zd@(x6-=5~scP~rV8Lm%N`~Z1xp_`OzyH#c+I~Zmw18>@7C)Fy#lA1N@GkM233AOe324o#m7n9P6cx zg2!;8%KD6IsDHJr?WcP`io8W<7WtVb(kIB}(f||%qsq!dFx@Hb0Gmnct0*I7|qlfLXg0D(&bbv3sNa;?OXsUI3;C-ndiQhfUjWjzDK6bWsCgf)+db&r$B zcq6;ZT<&_uC{yS;dZk=MzYNLZCDaI{dNWb?oKup#g;GvRwk)?NWV*inQ~WondgO6e zHDI*}ue(B~KA}{;JBuY=*9ElX%UrA!D*`7@DpVOd^2R=RLXLcrp*+T>SNa- zqum4(!QPIQNGwLFL?p-9-^yt52w%Uoth{vZorqgl~vTq2e(O;;zTXXwnds${r8TuuC zoJCs7GD$GZaH-K3fcuIMb%t5_hyq8>G4pnZelw%9rYzMj zUmNDC`?8!`KB*yKe^-pM&Ugx9!W-w`>PF|46qn$)x&DwOh)567rb4xWar*V}IBe7h zs#E*>lc?oUW9ML{v!cluAxR^8aAjmt-K?l14*F$`!6g8mDOto0Fr+f)G4N6Gt#*F&sMv(ksy@HZB zfds}-XCpk{qq?lEcWc}3DH42b^Id=EO;W(?vwvcfRo*MnM!m{aRc|lj`a{|IB@80Z!NjGXE>yuUM7W-7$NCykEu(?cJfG_q<7Kc+ zC?@elILerNv+~w^(w3Soygp67Wagi@6ET9-123L(soACKP^~P*8ea9ky;G~s?Kdw{W0{U zUM5u5rI1AyH-A(fC2aVM4uio1swoNXC&!(!PEx;X?;@vGyJ$63`d*tSLTL$qxPBt7 z17WbSD1}z5Y2wOK6y$mx%ZY`y{h6C>zp_U$CI|BcHx^fr03CX|8VwnGXfMTf#@fx{oit%y%yS1_ti$4>+Vio$&=>w=%1CJ*8(`cc~0qPYF# z84eZcKS7uHsn+5QD#C8rx`-tg_ob>3w(AAj_6_yjHuj=$GLoT_s|2^U9+~g;Pu@to znu3a&Z4u6jlx$fgkd|}SemA`>{Encd^r{|G52q7o&vuGCO6;HMw`NJd^1pS^AZ?!z z#HUhqFiB#~lpGwJ^z)u&QHktqoTS$1Ns|5m8IOK%o(|}kV1s+=CMPLH*1$#ZTunNF z1&(@2!gBOc34NWOzX8kgtWpioJiZ$|f<8@nXUt0X9UA0)cEF~HnHcJ7|A^g2rq8*`cm2;^EN{r!#RL3d=3wV7FGO>^&t98H&9!UIR*P(K2KM(QWTtTv=4>5GO zU|yNsx2BalG}`MYgY+u{u98?7OjLdaJ7$bP-ikY`LZ|mJWK{>y*^$R@X}3c#S35)9 z33aCt{ZIApz@&v;7O7hfsejx&6xbrSszNq|k+3RMrP?#9U7KZ=@jTBqaxs2ShVl;V zCUy7#lNcvzfPn5NOYx~4YADvkA-H79J%gr+7A?1v)}(mhV7cP=iN(;E!rN_vS#OVa!LAKD&!e)yr1od3K^~_|h-7I*wsccr(7)={KL4~)sif{0*12$*xZcWm9^S zu!3*xmERMMMIv?Q$&OWQo?1DERGjg6=2{GAs5LGJN!ntV`Sz&QIq@Nls_5U%dXD2? zTqR6VJd^w}`CUc;A6Qk<{xhjlN1;K`YEVCFk#RNgWzEGe%r!>>`3jWxmKRgTi--G8 z;=D-oD3BKWu%1Yvw?#$3c~JNq&oeqnBq=W7?w}7Ew)NyRsnxEK_EaS=tX8>F&B4xB z>CKH4Fx4)HW;M~hz<`|{{jOnW{rXw{x(bu3@v9GR^eb!oEA+?sxi9IY9=HdRsb>5a z5DG;s-~W!heg~2Le@9;F|B{LSLSDbimi{;9^>4jd1<3!#yoyUJ3o8F*UKPGG-u|Yd z{f$|(H~-~mYmd*w__yTfe@8k0+4BE^c>TBO{yXpb4d(s_?)uH^{-2`Sz8TJc;;wY8 z|G+l2zn5&KZ|Z>mok%BWrf;uk?1)eP4Yksmd>?jBwvNU|23Gdwre==+b8g%Jl+osH zY;XI&1hxGqC2RbTq4;S9X@zJ-zQftXX#a)9%F!y)D*fk_|43=mr!}B8{Lf;vX5Zy# z|Ib-$ZnWhC<&&u#0m4d%h*x3Klt8Cxg>%SAS|EFin-@$hO)yG87i2wKa zXA2`U6F$Rt?%3aJ{@3H1(EX3rf1dr<82>zDW&exyvVPa9W&4I_zY*H+I=F1#3;)~B z$o9_}SiVVJcGho7_n+5(L&|?&`}Yq1zV6>g{O{}h$IRbXF|q!wnETJ4jDK_I{;ufz z`QJ5vkMqs^{yqD<7k^v-)%&-diJs~EVE@Ox{-f`^?Vof0qxXB<|H^G+{JW5Uy{Z3+ z^nPE={@-X{dM3L6EVKLXv2FD1Z0!Hnv26+-Y)WsKq!fcE&C2nku_2_4by|bW)?mh1 z(5)*a)~V{_1}4-di+c7ev4r;FIP}g+_7LLs6tNNwp`Ow1)g`VvF-42KK`C!sJAp!scgLJc_2Md-wEoCac=!*om+ebwT%J?B2giAq46~W2*(qD+@hR z!KsCM#b_Ov*Ax_v zK}xf>N#$*jJ>ANg+t`2~W6?22oz=#DA{SW`=vO78{I8_(wx)^esbzHe6nZ9K0cqP8JhSiDqDocq?4IhiX6u( zNp%{*c=sn$de@3{p`qtm&9=?aSjt)-n_@?NDko}pIU$SJ>#F@yM{B9fH}RFT$#4<1 zqSi>rsfgWKisrnXr;jdGBiFM@+WF$pNNXtMvAYg>Ocjc(*B0iF8EP5m7nK>L&s?mh zy>6pf-FaIUczJYWYS+4KL9nrP!N?dtn)S%)Pls>&Fe5?bwJjboZ99gf7mrhC9OAyh zRSke`#mxz0%|{08Tkve+3;7_XMU?{1Og1I(nkU+?Nh$VfD;kHP<1`%|Z(bwguy)V+ zqfT0d)>j9;e(1MJUK_Rys)0r;gNhBVgL!!r^38ax)Q@s!yU#fEDtW(IGOPr@+GrlU zhs#l)^~&_CSv#H@rMRS`UHmoUW+Tl56&mNe`N#S(LrupGHq^Kqeqv}c3!&+ z^Kg|=L1U9o$RW^q1Dt%uB1i`nA{NXF1nWrlCUokLxyA3jaNQ9CMXRRVcG?az@fj!P z(){)~WM-!HdEwUAYq+LPS9mnayfmHdxl^R*2+=R95D`Wkk@mDGxl-gLzD+2qC9)aC zQx~f$@Y@#2q$!vX+%wklfN9B*k5%js;rqu9C~JYHZ|oh)k53;Y?o*`WiI%6@lrt?T z5@VpdZ{Y10cU$kJ>edS=xY-4ocXG%z9MqM+o`v(XbZo(nm)k!JI?Agf?Kt&~E#f{# zOhqC0Mi=bYFC3=e8Yp0{ywu!jenqa8w9R2H67_EF*ky=|j(r#B~vnbMp!kd#b47pF&E>lB+lb zKapNLaz$Tco3PzGos4XmbXJ~pis%$N*Y;RU*tJI1Py4hhk89j397Z^wF?7KYdq+I2vwg$@zs2PU5CfIph zS+#{U-)?bU5&~x|AFPF?9O?AcFqMd+C#KQpB#(#K1e>O=TW4;y$oL1*g=b5rD7?G2 z1&fX&^9w}f!25w4xQK%)7g!S7Fm9oENEn*K7c&dqYRgD^Fh$h4;@O0mP&fvxev0T- zfwBds@#s-QpLdv! zW*>=WBa3z|m1Q;?iBFRiosn=!7-%1BnAwFKt+;yKG#E=1nrCsZ6(U8hqhE|T1^HJ? zTXw8{gQQ4~%;CyNBlcGquL(%FV`TgD3L2gwM!t^&5Pf7$QCEwziggR2t-)JOTyAt9 z??Y!3?2J+drCpS(!Y{OVy}CeOXh2jn{riUG(Iapq@36!tWa0mVV*mfer1tIc`cK8q z{4G5G)1>wvSiM`v?Bw70ij&a`Q_5I zeW}2vEcfl%vi$V~zb*h_)1&PV@*{B@#BA}q9C7*PQSDo4R%L6-)pM|?;k%&>CZsY9 zs-0vAyBHXdv$4LZF&co_Ps*`6U_ja_K734=NMdB8LklQC$&{AgAOPp@?_2<&tl$9P zWB|jI-4hhu6X7Dje*)Ot_^m6fwE*v9p?%nIfckOxG)R07r^$PWBYo?0kZ*X zszF=aYrZ?N0Zx5{n*rweY4D3VhhtG9GjR0GEq5U4z}44&&n$n=62mqA25|i{Zgg~b zy&`gfpFa>r_WiU?f%ZjRFD)r7FCy=E(pC9*C8*4( zSzT6`gaiTbzW2de_qCHmz;DeB2*#&^|L0@i=HP2fR^&@w3eyU(rXExin623jz(lS% z1#NW+p9I~Yd~su9Euh%b{iY(=dHeklpQd(7w^Kn0$BRrhIh5>Ss3ye0L+_+zbm z0$k6*y@fL501t`RcLHel_<1N4974|lpr!epzCFL@)6!7aT~=~LR1wm|7?S`z1h_dZs556-R&`W>$0KIbi1$Nuyq?OE6U^eZRn z)JJ2_CzSC^(5KAKkdlASi?hOFZKvN>eTDma`4L!SF*!nlDAt{ z#&5SeetenuQ1u6(A%S|u+9Hy!1znCeN+^W>P~s|X$F8z!ii!AVH$nK5*!2%(q#@^I z&ghL9)(>a*NCO%yl9ZR!xu|wq1b8rw)g@wG zE*TmrlPblPEE^v1X9=(?Zs8#^xd=be&~SZT*1)B#sPjxU6fO$#Fb-UP7Wmb}u^S6{gS4ai8Hy8NEE%fD z599Tkg)Q8jMdXY%|J&{ytB@@~aV0}z&TL-#3fJ6QVTeErlbg$Goofi*i=*y3$Cseo ze@=gQ48f_$l*0ra9FbsB1XlhyWhLL!1qCf(jSnpx!!aFs<(y zbIGwHXEDwmSHY*h1K!}xbrCN$g2%JynmdfSP)E^|8827_;+TPo*-L$%;k=9zg|ZK) zgXUR&uJjpea%Bg~vyFCO4Xpe&C)C&7eZZGeB#0j~ZYC9KX(_Z6PPnjKj(et3)=Q7v zwdrzlC?ijDAV70^`qf+{U#la3o{V7o+#n{LX%s{nz{|rtIBQsZm2=~Z{oY-C5e7%I z)p}hIy$t%uZH%^be)Ihx^SGJRu?wv>l%&)J4R$07++UE_M*@R9K^80;Myo zhYRRnQ~$;Pv|`lD?tIN#j5y!KqjJuiv+r8Z<-fHPQ2!liCu`;NM0{xC!Q+X^zU{Gp z_U>@w%=!>R!!jAdccb&Ekk?mp_i^wP(0rWNEnSbhcIPsgXHAwmbkmF~jzZ%+#8C&) zcOKPtLAbENFb4LAYS zye$>JZiv#s{?r}$EKDHryR|QpG;Z{_=WUUyAA^FDI$28`2BrgsTSq$IiCZ2&fiWg4 z!^vZTNHjHvpKRUqm7^C;YJKd{!=4>jm^+;rbAL@Nu3Iu7&`t1G_8O?d*{wUMz}8xE z^)VZ8o*t}JAO6ydy)7wcDQMR6gAHNwBllS4o`k5Mvf3RU(ooI43!dFkpOKg0jkwX) z8pr_TO!m(BPapguA!P*vZZfKnxb$Z>5=L(D;-5zX3|K70&u)}zd|0^^7Ir;RRjx3K z!aES=D#Nou^SC2Z6DtVz-3$7jKiOYOix4fEN$3_BE?d>~~MK6{s zeTUg_omO*3=u(O2p?PBS+sSkqD~6Q4!N7C89d2KNn4B|S87y3>%7h;t(?|sLsEpdO zJlt{ymP}cC0ws4nH>g5yxn;~cSGX8tFe*t(b9mFfI>yy^xh>baz2r~JH%+$6Tvc8N zS`=L_9z7GLe-1V+C@)G=O*JD3&(KDYnqGKICM;GXMTcm^Ms-WWBx~j0BDuQBK$4{M z#av-lAel_q=S^XaR9r5W%N1wZAFJPMhrTK}pzfZPZ52y>oo0{Mp$K%pF(Hr5J?b$R z5tIU`4$3oKIh~);j^`+y;a}IE+P}^1&yX4a|JpZ6~L_{b* z0lXvf9lHcyn`SSx?iUe@2-E1ir4{9pH$P>55)>K4kD}4gLRuKF+mt}gZ>k1^vp$Bv z5lMD1vwtHEv9Kc0zlfR{aVkjQ0p#fkf@mxNZS@^=HV(piIUFs_y>wx>>8I-h)n;kH zp~*LPrKe;YDrUk__!-r4x`-jYtN(_R*kxsFF7k(IjW**ler<`M?CEd^W{j|KBRLU) zh+3Xt1aKPQr^*5-@nv;p)=EBaET=63HzQN!-0KV6csfSsQkOjh2JBU669<)6*(N7% z&NC#J^09m2VLh2`r>=g(j|nQe$yLr2Z6!gxuB|f~T_JQluC?bw;M(5Hyh)}?>g&p_<9y1;7+4hGP zQ|7Oq4#ON%8XNb{PII<4UF`tou|p%)X{gBTg{mjAx}MeU_z-K2-tearg(_jEjs@VC zqmvYY>2l^+v|(4%Z%Uca5CH|0xpcyd7p1tu_cauO3z_p1a1&zZc_!x`{O`eUT=LN> zDJiKIV3CxOwZa-mRvmNkKv@kak~d@-R+EoBSx;vJCBTNpUGIWUU4>-+A-(eglL!*v zISm-*DrpwD(G9xo{Ab)2=i`2J9oxon5Ny}KmcTB|$h_~CDpbWf%C^ckXV(a!%udbb z3N4kbn@jpPkiEJwezKVu*AHT_i`K(;!nbz|(z`l<517A<%g2?LvdpSJtEZ6DM0+L8 zE>8$oG_38+z%8(_tl?Yl1iU0DOL16@LOl3R%xD+IPD^LwjHUs}P90u?Kt((2IRgz1 zNk-x<>K+avB*+L7U^Obh{lMfrjBNGr4{?VP5_lvQ41cbQRqE!FTs4&I$==PvC6I!X zWi+rCk%L^?&iNG+aa`I{y9zfQ-y8s@E*6d~hQs*sMoczqPrPMCFH@?;Bg^lXhi!f7 zB!*Ms8XcxUQxu#vlIzy1!Xwb{BHTJ%?lxw5KwYk#Com_j3Yt`efU~)`r^Kdt5-hnx z$8xAcVdGG|RSc9H7YrZqNo+ME%RTF+>w5fL+VW|-_8JIVvD=eZl@E~wcxdvg6cU&S zux*pqgesPlJY!Npyb?lUhl%G|&f5SMu47%IM%`teUWJjDEnBViO!tUBhc%?{JZQ~x zX;K6sniA6aOJ0`SB|-Q0o~x@HkyY)64Ng*mB6HC;R*BAp<}6l>3uH_8mj=jyN(SMq zm*j0Y_?^4r)GtJ1e6-HXOpKS*cYR)jEFWcrkcm6std#>b8rhhDk#U5LB@^d7T#5EVS-hhy}%}|fLKZBS!Dt=iV&MQp0wL5 zgsorRAy-vy3;L9d2E~jv2<1nCln9ct%yeOAx*{<$WcOJG&!v@}@|cQyf!AW%T3&C> zYq1w6iXlWT@7Q0Av2jWW$4UR(q?370)pFutw~UKJAIx*+q*vPh;Hf+y7uA4uW$QSh zkA9x?2*~(+iP2DdAwcj)%%gdGpq90*?Miob@Wg7lQ|z~Fy&__-n>f3^s&w2Ed@;kg zJ~md?QLUUNk!p(Z;`6SQHqG~DZR=#Y*Z1ReGQK3=Zu(L&X~ZYti=wo2mV+Vt!bUUX zX!^(jGR>cQxUoj(E}=~a=5we+nHcu!-`NS;`YlxT%)y$ z2^K*Ul4=)k;~YCW`rw?{#pJQaU$;2 z)*(2U@`l}2$Q2IOId`mwa!+X@Ck)+B4^bJ9O1QCqKi~I zZ27{d1&54a*jDSoM=MmF(?`!^^Ad?cQ!}Or&mpE}sW`jVnFeMiJ;6cV&#bJYKTsq= zKG7eic7y&-f1Xnw+$cR0qP&y3fUk_H@5F@bN4sz9W#me3ZjZ36+)TE`T=vR!W*D8S z{dmEN9JFVt1xEv@JP{k{HyksD{!~L85>2chgL24nfjHN96rmAK=sA680eSKai-~W~ z0)K+Jt_?$@P3GQr^R+P}nkp25a3~xnG9u!eA;hW0+j=@?lsDJ&WiHDuwjdGIE^FU= zv%yo5vbR>(Jd?XoTj?!F&`$BY&sx7Xh?d+)7XEfWnfGY9YbGUFRmtlWF;ys2vZRT^ zG(u)rk7-#uS)|~1S_lC9vUb$~O|XS>^?y0-(d|l789p*`DuNRoDRTXJhDpqGbKeu{ z53U@yN4*)9;kILbV=N5gh08r{vIQ+!wU^x|ln8q3Z+lLeun5hxS`F&d`V1cF(D*n< zvqMRh=5!^eP$Q7tvi7^ncj%J~C48|%2lRo*1uLN-3>#op2`V3WsItdnhjUL0@e5_>$pVj+3$Y1^jCjlOq#A^BJ|sY>-+kK*IKe?_|NImJ%5Gkgu55eNq;qY|nGI*7Kt1QCG^bF}D%dAv zaI$wH&$gVVuxR7lS%HH+y<8ovCc9nx)&l-~={X^FjflwHi>EYUPPEtWy7ZR=L zNKcS#Hst8#4*@CkN`BfWJ%u>oex=zmGs#(3EKKa)VZDg_l!X~Eq!-CYNTZ%MZ4hdi zzRqfaOV&IIPv#ld@okIePCFTWXDvxhg(*}mnL%W56#Vy7^kP;0-hDZF*za3ny9vb zRl!`Um0?-US`D+J_h2pBUs~EmEB&tJNGZ_ZZFjchjHP$_zG&BwURX-x`E~83ssD zjV{!ieMoK(M?NG|Tw$wnN zyLAfQ3|Er(`oj@st0*lgqx-K%SQs*UK+r6Yf|ie>M&Ld&2Zn`&x$WpVds(Wv?&fD5 z#kpT!5$z08#Ond`Fr*X57voVaqfz-kFGm)dvWSw&6l!w|`$(q!0${MHq&X82`s!`R zno7W)tNhEJ()1o8PJ?Iwq;tY1w>vOSBL!w{$}0)pN?0X#iUN(iCt!sJ7YveWa*d1S zmEK3L*~PNBLg~7d`ovcR4tQ1u2J67V+;}J%A{z#-DH}T@1_ovtk=BiXGT>*#64mj? zBW^M6Vh<3vE~>w3$dh-|X2Mn<>fa6lI8QZ`QTI2eo&9<`I9R<~Q})kMA|V)%bI(T2 zJRb^Hq}Tv$bxh7LkJn(jB&i-D%jm;s4Mm*>3s-Gp0JHMUlsjvF+87M9<3NRM`I-oY z)*{K{P%fQix28iIc+y`oTe_u2)KgW91fj_ph#t7va%mb4xg?)x2Fe0Iit?mD;tL2| zHH^q&>qiEKGKW2Sd04mup+6b0+6uu2XOLvPEudYf%ppaOzkupSr+0@rOr9RSf&deR z?FbpZG(n(CA*p#@_>W%t7jE^bajQ9NZ{Dj(k*}I?wJa+x&Dtapr(e&dFDE80qUGz- z8+*Xd3IowulGx4m&p113ZMngbKpqQv4LW*dqC_P9(D)IgE&xN_aLC*MI2XzR$^eaA z&SW#+OGDIu+5^7AWu8=WBU&$`t>! zlJfK;+011jSv-siP`pr4A3zSVRi+Ly7PwH9R>mt!y!R!yH#mg|x)za&f>hkTpl+Qt zX#hQxl{^OnnAjw!7$P>wwLH}Rv0_mZruY7okx-Y@4dmUIpJ8y&sf_VVee^+8YtBWh zN8#>RBjx5-r+Uv2JCKyW<*xH9!Ev?xg2D}fv4&0(#|Ke$p&o_9Jr}cM2NHWQYtXo)3^CSB?o>5kT?iS@D8 zqCRe$LGA2|vE2U*Ze(;0h&!x>{o~CA0nF0yhQi+{84(2{ zdQX?0nc~4TEPlkZ>q*sg!`U&|SQkA`W{q31F09lcWFe_Z^V2^{cYW(ur!%Xobf!MF zX+Xq8#+6#`EMK=kl&2oK!59IBfkn9(&fY|wy!~Bq*PnPr1tS~x8V2>=Hb`c@|dzN;Zj!ZI4auC zLR;?W7%)dpq{o^wImmgLOgV64I^`Rzz{_76k)?qT_1*9kd^{l@%UTQ}k-nx-8Ux6CY&c5wJ58ViE_?~H(7(UPv@^I+M~74geO3xwRbZuT|yX~X76OhF^uB}kK$Qi>9- zsa_w!zN;|EbiQum{US-+y-zrX4HG44>f1Pgzt%DHXyv8Y677vbd0zj&gd3W=CH-h6y+wbi-y)*KA?TXFbEMlklBn_e{gD9sT5|+n44hgUBx33fKG^ z`s?Jv@V}p63y>N3rs%wNhiR7opr};7QQ6Y1vw~_i#Qcs`ZXE^FNXTJ{YI_PX zU22$#V$KDR+lH(svNa}j$c~gx5yE!AG}`!seO-o4miDyAyBsag zzupbyEbWoF4<@7}>OV%iLppFUtMe{{tq#hIZ+=b> zGL|^2<^#({-hk?J#mx)do;6RUP8oR**pEk&-Ib|%5uVm|g+i=HD)p?BMk=2%u_d~a zyi6WldiJ9>yW{fM$SK{?juQF%RD-HI~OH!mPtua zn7$^72Jvf7lGU&RQXAKwx(c@!iAOKFMwy5$o^3P$_j4^&I9eaC#XyN8Q9$)DHVeo2 zTS{}-i1H@a;C!$h*Zjs{qgjKM0oX80Vl7-Y2x(tPu`BO;?;Dn&21Z;bFW^5`Mmnq& z(X7(8{-Hr(F1t|_#KXjH=`i)}mJ=hhX*v+2ltPSFd-?4Qi9?yfNmz(N-K28_lIP^$ zLzJ~#g}s+`0!w|mW06C;^YXc;{`j;&{{PVS4$zUdYr<}9b<(lZVaK*@t7F@?ZFg+j zwylnByJMZ|Z_l@9@0t16{O7E7lJ(Z}*5kaDq$;WFzHa^Ey`nMX)=L>-Qz1S|~qn;bRmNT$`SQv}Ex_@-OcHXAU0^fV*2$IW}DbRN1ZO6{ol<;9OgsN?ol zV*$Ie{?J0zxvYpoVjPCc}g-joV*e{2P)jtm<5OFJJxK6I*KL zwQUT@P?q%=Cw!qq1Z1*o&6I&-8e>B>adrVZnYK{!o8rR0$5Mo!5D0|*t#<|pduIlj zt6L@p9;jm$Hj8h0C1J`EBb2i$PG#(OOfH$k%!gJ58+ty>OBJ^PS6WYba1U|LwXnVu z9o@fTri!)9V6{5~YvH8JLy@(HGRoxgilaMMiyw4dl3h8r#g`& zbINI2w(f&yKuK;@C}WyY*awFH&`njt^e z8(b7y8cT|?NIFJ2pt0;~cA1E!+piHlS;!`NGMalbyRGS${BGDR%R|zKv!&;pb-IGS zx4{jFiHfHlxJDq1#t8C+oHVOeH(2v;Mj6Mk#B+Uh$xsq0GIM;FMIj_P&iHviUZJ-V{X2H|5r)O~N`WG4(; zp>UM+(<7oh0eSLy5`6uH{>T>7-2q|z#LV&sdH?_G^N$?+&+$iB4FKf-y8X|!SQ-DSW&5)OroSB9 zf7;jqfe?RSdPV{krauoaD>FL)iu!}uv-}5w&jzqu1I*R`y#M!%%m6Zs>CXWO@?ZvV zT1~e3 zl&CX4l|Qm&-mC3kO+3iDKgWRB+uhwjHh{kqSmd;ie@ZQYeynAD9XatCC3pS7wxS{4 zw#)$xjPr@G;xV%F3R1an!CiR{#DXS+*WECNzruU|)_LSW&6t^tHji{I0? zvC)SJUgtqD01LGZw%o1;>IKZF6Kdehf*wm|2m>@1Pv8qbf_tDtn<$FZgJ2K*LHUGu zXAiW@?ZxNw6Q$4jvZtG&1?ZfGfcB9W*jlV-^R*fd52zh-;KS!9dLN%n&UiKyzVG|i z|h8ILTd%pe3Pk|A4KOe#Y-wPcmJKaZg0jlNCASB%4ZX}}pH%P+QlnuZ$E|lMg zz(||cr$A`cnhw;g(VlUPUDR$Z)zkJGgNdf0l`|A= z(?!);b5IZ1yK|#WW`(Gcxs7Gb#1Ezf4QP22xfn$mb+D zKh2MlaA{bTyE{aK26y#?DVx|Jo>(sk8J^+aciJ4>PVMsobTq>N~>{Fb9()%b}R%QtM1qPV$J4@p&m^FNR~? zE;|DH`$)}~<`~-wj@G*!?)FNZ8P8EzcJ3@-@Z)0Fu+jO|2Yz-f6qYL=WNA7-qnXdq z-kFA3>iv4(+)IM$+IuWPet>V=vs`v4*zWKBh5e0PUU!xjt!*d9BvMU#Gu5k`%?K^V z5p|PONyAg&xIE{19Vrep+c~U{^AaOcT?sdrzE;pIu59jzpg2@nvwY(H2@HL7i2hiJ zBL~(|L=!n$l-0KP`*K-j#bdh%)xz)cs%A=`d2v?JEhmRIGmBU;tRu=a)?BSvy!Upf>p4|E~{ z@w4|VWgSgYMF|d*ZZgTSF51JWar=sO5X& zQ^_p1b&-E}$W5#1pKSAll;&8w647)Yk5M)xS}8brO1;`F&6p@kuDx~c7z)1Vf&R5{ z;)>2_quRXqeZtrlwW~&2=LB-eg&ks-K<6d%xUA_M`YPH3ve#-78P*(ePlZD27asXl zePkAVm*u0iM>3bAQra)+>qmmK^dM4D$&t4OrYZ5&W|vMM&WYx-$y3;$)pS76+_jRN z_I%PX4#Q)oM1CZS?lV#NL;mTt&<#I-2xjRe&Sx!GsvcsO-C{r4p1AMJ!b(e|*`{^- z4(i}c1l2O$2{WjOZ9;lSr_j^L=fl<(iqne#j-uty;*~9kXH%j zO^%FI%h*QfqNZBfxLzN^Zwj?-y#fg~Q=Om2LaZS2#}6>7=CA0Vt>lV~%C#iv#K*;%-v>H6}tJ!a{H5!ENDMn&6IBt}=<&BoI- zdrAw0KiSlAtKvq7Tz!3G>DKDFjlofR@Q>;iasE>5RTZOZ$BGTRq`5~x-VblotkALY zs*q)#or#fa_%mTi%VXpC6QqHYLp6*p2p-{m6izTa<6DWozpSR<48>H}58S@9M7H-F z*yie(aqli4UkV79_o)5an+DRcyOdnIE+gqryKtOUnnpQRPZOsvK|dn~--Uyq$y&p{ zHJDhK+R9lBwa2K7zdQ-mqC^stuZ=mWtzQXrgaM-%7f%k-a^@YD`{rSxzqH0U6aH<|l7!r{V}o&vhey3k zddv$amF70YU?f6HsYk{80Gz+LQ`ekN_tPv8Q|YMhC_-HZj`|3?$!XDZ%O05Oy>Bi! z%iSMI-^HT+EY?!raVP6rj`_x2Bbej2^`+5+@(h|0LlN1K-94UaCYd8@wbLJ7ID{&J z2uE#PwiT>qi@IVs`1!l0?c|aw#58AN0WzppcO-gW?r`fa>G{4vW*NQjwqBZ_RkSFx zgdf>M?loXqK}=n4ksYNa9YsI!)%JV{ZF4XFyo`;xtKR8sBDkK`iy=*(?lB6Pi=9|4 znALTT@@jV9FcGOXkWPeD3 zU;#$Eqs#QH=XHpmcq~_%@WEm~T2!Xa8s;SxC0j7p?sBi6}w;=(DqR~3d^gFt#;k$%VA5z|kxT zI-#-RExS&M87_IhV>N`364m11jcfEJSP2|?91nP)A?Sj&Yn#Oa)b-v!TLiYBG0-ET zd52SosPul2Ff(K-QNJjIn`pVJBWhj-u@eU*D&(`L=T2_ocx9w3dx=V7&)sRsE@am= ze|+ntJ~}x<`UQ z*T%*IoDhl-*Sui=8g@?shPRtIuaWBcCRsCg!=tuRv3~Jmgb{|g132LR%UL52Rq`Z5 zbb=^(0_7JM$O8e>5SO5LYyYg)%t_TJkOV(BjoqT+4f09D^ng)CEnea*J0oJspZ?@Y z;hhGcA*PD&i`!5)o%)Wy&$U+t-+smFpo&w)@@`O*{8~>&^o$cEGMQm~al7)OQMfro z`(noZ_~C7khp~{}Wt)?CcNBM10b8!2$vB0*GIR1Fiflc*Fp>LAFTHZ^R4qDS@>rDaU3n<_nR zIc(Uv*6I+fz$#op{7abPz@}88dSqGW6KgfvK8LLV-PV9e4HtE1oGI$jAf>kzqh%7_oAtz7l|PP zXOE^`oX7f0ZCLHsRK)4MObnE1SSD@v2Ns5Rzam$C-?CBkY|w=Ihm%o*`dP9EeLYt~ zmtRA)LKz%Z)Z4rIn#W3H$&trIFC#~K-CQ_l*lT=f?W|PcH_r%f3nh6iJw}#XNXrM8 z1$^l#$`D?|s5slaAf(Rm6DzCCvexc5pk8N+1ve z`&X3f_Izn`H9C>=6`QK)tYpUK9iD2B^xE*lArQeN(Cl(VC$D=n@O`tTj+l5Hxo5Vy zR_%NA!}+~s8OACz5lKSMm9yyNlldlko%z`+8=2+^#vv7sg(Z$sbSJ3>20apMA_ru% zE(}k(6xx@nf!_+U-E$rybO$;_>273A`9Xf2T}hakQYLM~2uc%2U(9jRsHz`n(30yK zQ^Z?*bA!92Nyh>3749$? z*UrEc;Y+eF2tV4j_d{p+v%fsod*X+wtng*nTSU5(tK_9_ntPWTBYI8*iU~70e*?GL zND44f0yC6YPI0TWgj~tvPxZu;NsYj*Ll0-ui5W9a8{zZd9Y1nbMqI!)se_co*|gP` zy`r~avNz>J4T?ZIxp{?jaiI@hbH*-$`N)x`PJxesz1w6A|()ufHOR5SsIr{(vp{6+>x4b?0dSBtV=5MWsS-} zP|TdFN7GOSX;6u0tZ*qbZjW2qS#u$uvDl$t@n=fRLQDBr)2%%Csab?774tb4LWPV< zDA%wMVcPxn9peGG)k$-R>LN+QE(97^b>R!m&~B_z%kBzu4>DT$RnMVhGS+6LsG{zZ z9`Y^>t|*WGyheSVTXv^>zJD@*-APZ7a4Qy~75#L*tjz6~AW|v7YmZ+Tj{AYvlY`5X zPTwb>6xkP1kRQfFG6g51(@|Bd#=t|!HzKMG=+HBz6=2Y`0;!~1)e6XF1|%+iIfVcx zvkbMp5#{Ea;`M^tnJrvXpU=Teo8bKTB4urYSHlwnh|Cm}6Qa+4ZrLdk$9>n{&kDp{ zZyG}~c}Mxlv<8kf(Y^|dey!8d7ExPN5;!{k!bx`rYv6Pk4e~>GXpyaSM!He*dD@+i z^jLk{#0y(?1wk&WBi@+RH3IcG{D}iuD6f(T zZL#G!`TRV|X%k^+d_@fG-Z8R)`4zR?m`rt>!7(n-NTBi}SM#1?d8K$YVQi~Yo0P-> zbT8wJUS}^IWiI@&YUdit^P3_Z$`P6Fy}h6%+STL`?Xd-!(uYb)3*O4SiiM=$p7zQq zorKX%XdcsX1_Xr3_vP%7B^4^gA_bxiD%auConb<9A-F|*_h{Wtkl<|?Xr22?>%OVi zOc!EN!#;6{@{EX7m_GlBBN}Nl4LJk!gd6BBckJXakcHnPZ*u;i)w}4#H!^ak+euvU z&@rI9Xy;NsPR0bJ)^=QAfvob}NuznFdZFYexdyrG#ZC3ns|5%QyiHk9jH97gXyZCp zOD$#Wky9LPUuBsPH{gTA>(%fyZMsi|Z~G^7Gt&3-?p~Gd9+@uCN4bL|y}*4kJ{#tD z*X6|-iU=ow?a9+#p2&|2iA8B6_4frl$S-#%ZgO+2*YoPqq+H4<>@2%P!W?0rYiKx$ z7#Wsa@HrkU<+P`?l2abMZ2IWEdKfqp8Zi;ojQWF17wAEGDh0?$ITj_RSVZk!ACfLI z&%{r?oAKrP3feC1{WpE}*z{ zXw2BE$%ELZPvb@NfE|v7Qap?FUyJI97FPxx!(OsBf?#KO&xNc-AOkw?) z4;Q%HGEKO8b=*?Vyk|5euTGz;4hg#e;}d!3m>?7i<7h6hrl5k-^sBOM!4c$()(C3F z*Qe$PM9Ht$=eh1POCY6vd#Z^?m*}|TWn7&)%<9-ASJ{2#I@A7>VA7;QJw+n9hlwOL z%%le-NlMAADkeIN$&18H#LIAlnmRPD*h?zhb7vYZwwFZ`s%q>a;|PPxjbrvR)oqUr zQwW1tEpcf&xPl9&-X6>CAVpepYJA zP?8{u9HG*JZf}o{5)*QoAE?kS-r8aFt#|4XXMtWhvtVU(PEG8{1rB$uNC4fZa;mbj z>gZ5eFAM^<%vfSRZ|AXY76P>vaeVI7;WJ>7m8c~cWJe9U=;|#8AX6xs?`H-b1y}r z!VKjF$3#QT8PZ?_U)$o5w#`+qq>R4te0uxir3U$ud~mg)U+MQD$yLjEP0_Q$MO+16 zaabG~NO@I z!D)M~(V}Mf>|VzG z+}?tAWP|7T?JEvXStl&1HP`vGRqlm@P{!7s^AqHO9!XDrsc|FE{la-1RapoIGHqh_ zkF?3;{%&>S%4aez!_gZ{Us{+2byS1Vx@fh(eZ=oQP*O!ABy;(YU;A6YwfIYj(5HF2 zKTLXHYV1|zJDTn;?h-I$#-=kZKHO6x{PydWCgjrNkJiqGGECoVo5p^*h`Tjl>y4;3 zBHcc@6HWO9>~I*Y1rKr>-7KL2%@3!|@X4038dna&N2&YR&T}$;wWVft!96cEM4d4q zuc~_TybU+cQ!oCAbX-NfP&FH3rLjCex+bU~^09CHIhJ>`9)j19$lg0% zO}t+^rtRcJbC_)@6*Jh%)6HQA(MKx>G?3mdREdZ-d zV41i%+cBvh!)2l8su=yTUeYl{=4#AQ%HnLq{D&m&V{&q~k z)E82=>i3rG;|eLQ(*TVVn3g1Ga$*`1-PFqnCIzErmVxN4KhE;RE+W4eC;ooSFfWtl zQlNMtS(qowcxIz5p|;w6iyZtoIW3R77z_=|LeHYp^3!~3=ZXU(l&N3m!Ev{x?1Buj z(8lV)#vHiZqcvPwDP`?V?Dias388A(H7c!l%946Wzmob+FSGW|`4k3~^B%sh>F|W! zVkm^Dd8fDyg{S0iz7gt7(!z+cGLKnBj6pT5HC-fK$?mwp+_X4Tkz>*-6EdTDIe zQ!CZAH#hno`*t)-Ly8AEo6eY1bl+`YadN6It z1ql|Q)jdo$=K|$W6?F7JN^5sYY@cMKEFFk#Mtrd)`KHO=z+0Pdnu)@->;+K`9P<2C zPX*554ZJW!?g_owryGXF6XjBW-&s<^n(XxOOsjpbhSYGI^)#+$VSz_j12kCj6)x)# zEBu7yU`KrO^ntWi9&jzY$=PH0L`1DYv; zxdOjSaPu9#nUnGBz`;Xm_?auLK^tFH^}e__>(}8ERT+#Q3dE4b_#W5AIGOr1xHzsW7S3!<<)X)X0fU+%;98LnJi26VW0(P}}!#lz*xrF{P>CCiRI ztR^PX0N+~pRonlUf#%Ec&e}q4y4!YLR4{_xi~7T?YTap2!O5`}$E&RuhucZT7R%$Y zSI~Tw1h?OXD?(F-^NZY*0$%Mk#(D(zDK&McYEhqDi;G{$FwU0KtmBh`WY_0Hl^^r- zJnIGP(LmI!Ehst-c%ni4*hI6%c{X2D(CS^NJMHiC*^(=CXC`RH^oGN+Nb_Ea^X!y} zxb`~D?tYq!mz8zNqasHK`dCkO!PfFqe-`mTj@G?^R+k)`efUO21(+9inK|jm<10_| zJg}jkkpgV#6TN`IX~W;+qEMs0TjO$YJ#d#~(yuqUX4t|PzeUZ0GWxhR=9-ql)cH_k z>(RkMA93C;XQCvV8#8h6!Fw?hv3xpA`l5O4xbXY5)hX&NS^3SAb&!fCi4JL1(m?4M zQxn@FZN$m+A2EkPFc0=ATyIh;g8R6r-o24&4SrLjT7 zUIzfnC^`5!#%rHMZi~Wb#5)I`+;HRJAgkM{7+`Oli$qI+2NQ-{(}nW{Y&)D>EB@)hFKd==ZZ3B%~Auh1IFraYs?Pyy zSP-9h3#BJ=74KekzPk7s=rf(aLUXGzC%kAYC<2WVTW^|!X?4!srN3z>J%{Txo7)D8!YmVOxie z=ek+wC3Wrg+mm?0j|#n2v+XT3q2ygGM~K=~TKQh_fZS~Fdj?EyTh7^mJ+j)Cz+S3> zufv3{B21fGMRNBXedR3oJI%Nw(doew-({eZH04GcpBHJm$eSB^n-C@XO}oU*M(D(bP%C z+_%!wp~^?b^6aPdgX^VnLQk?z>dsJgp3lS}+jDbXC>t5stzvg(@)ljNFt2E{1M3o; ze%S61xEVZ`D6NaZbx(PJ;BMemE=ipi*~o;(1mX7=IB6DxXe%aSZU*GJQH$)2#jg^_ zeu611IURnJ?nJ8q16G!=L<5JGBk-&<3-WLLh5n6LdfyUNz@`R+)KDMI?$rAJ> zirCCNCUg5hw1Qnn@bF9#3rzcUEc17S9P3S`c0VoU-{5uBF%*X5M`Joy$2{bTE%d-_#VD3_nU0nSjZOnvX8e=0 zFbLjld*}B>G`9_W{C4-+@bfz3T=qgaZe0|n9%0{g-ouh~j8og#K=Rmwdb5{Xt|274 z?>y0C1(q*%JVkZw{l!aUUpB@`6XBh6DL~S&Lv5?kfL{81`vd|iH&&(eAF7P7hOv85 z<90Co&dEli&nyVeT@L&S+$iNC1$!Z_vv=*k|40%Gb4{|lKUf><8z<{uS!>-4)7`D$ z0_(P|K|RUk*nAC_$K7C8WEKVRuX$N2!>-`->O`A@RgYK4)VJKyGn^Fa);w`e$LL0p z-Y~l)!P@~SRI}%5aVN1`GTrrqTzaL(5$vU_@$O3-c?Eqi>poe4$j?HmQLk-|DX}j+ zXG9T0f*`w#3BtyWw?+7MwGS13iQ{aA8L|=~+@(SYJ>3 z-*PjiUyW`>hLJZ6I565siz&!xdGvkCArX5V@qFA z6wE<+h(!M%t?x_F^6sw?ukX z?m{((#45bM&CQ|b7lkvimU_Jut~g5MzU4@$hM*Oz{c7VyLYP53R67zKeDLvHNIxs; z$kdj{!WcDGz+GS;f>X?IVV<9;s~47*NO%lpxS+T6AcOW zW}^}ndE=0quTFXqUJGk})65lPFU%1l08G01W!i zyfS)LMg+9~Wx;<1rvE8Gr~gAv|C5(y`j7Df0yeG$8q|z*^nV)_|ERT@SpH{V`rnL- zw8l10_5drovk|R>nJcY>k+YFC?LSoJ)@Ig5wEVOJ0He9^Uq*9rT1i?d07@ zfK#jg3rcN5`$uJNNoxhbscis2wcS6FYG+y(TGxMNssBO#{u@jEw`v=pF=quxyZ@Kt zZ&vvqB^!V{W}{~VNXGvF#jMOM1gs2zYe4r0vu6UR;Q=%>;OeljGZ4_z0dCj<5HcI! zBC-C3OtY~t5U?-;CiqkPPj~vCDgS*D=05;6pda%eyX2qpFY)@HjsCgE2r!EO>Hnu> zXJ-3HkN;?6p<@O3$^q7KfK#1`iS@6xKXre$`=|U*Ae#QqUjP0s`X><0@)zp=mz5H* zdB80Hv!jxpj`2T?ST*2H;q1p#AMWUENqee=2Sq0$p`U#8^5Ya$+zrF}GFVmR2A>Z#_J1Jsxd12w%8? z1@u#0lPh4|WW8rfaUg;N5PuFe4S!(sWV{CgbTxPjNfTd$fmPuBopIn;duIsK&--9b zKJ0x2e|JAiHacHE->85_$Q~HOBcP$}xA8dSWi$|^C)MSl`TMPy4n8@TpAJ~t_yhY$4z?OzYwD9n)EUf1| zzG8#2yvs(@9e-#BmH~w)`G#w>_?ddNg~&{e+k;2zrS(bis`{`6_cmFx;K%U<6xqtw z(&AeqwEVc$E%hlVgegnSTla({oSjhHmm+?S?KYzDw72r}aUp z(AfCX_zCD0-~;7M#O@=j4fQZ_%G%qZ_9@6m^Aj_j7ip3E81c=b#fM-ba|0i$-sBUq z?~VPlzuC!;pn+*%I2*U=aivwy1nf`^ilAp0^{Jce)E`&Z zLrombxuT^7Ot<~Ix}=fpD-4Lon-@wyO{PzMCFprLh@U6lA_k=-l0}^DaK*#ODM9Pp z3f4aQ^_(;A=qa_=-4%U5Phk(Is#Hl!=dvYBi${WFXnjbB=!KW;4&EAW4l}h6)^2h} z=Tpm(QEkfElCYj_T=`-9nS=+5bL4B4*Ul+6e#g-Ip`lZo-imGS%E*m{wDC&HYsndt z?fZ~+<-6O?8wkX0>r|Wkm&r&jrd8J!>xJ14dF)NslTtBkMm_#$dDF}ai=$X;S^sv0 zhTR5H2cdK`?g;Fp1Sy?!-2C?aQf&Vs)gt9u&a6Rm_TVt5N0p(oU(b97M-fjQ;6;)w zhzS`lcuNZ}L46GQ*;uC2t`=YQ6Txe6^|!ic^JjxBB&>DevQC!CPnw$P6uP~6l-q>N zs`IXYp)+p>}T>l^Z{uZ~}_=8@_vA+>GaF1527Ny}ZD(Bu;H%?Yxk(%zFWoAc30%&9~i@-aXSp zqs4vvJH+Q^coaW%-|aCM-Hp^iMN=rjxK89y;>kJp2 z2SLH2X?H!^Ke;U!?nriSbg zQ!r|&mPv6Hk(_gNH%Rn(X~K>r+_{a68C921>xz4J(eSF2iJI-Sz9Em96kOX*q8gUN?~tYx?d-2A{wOtnaD9qr=FSDKhCnsNX_`DQ76P z5c>>SL_TaW%XmR?PfJjLhhoHH;|DvQ10S&^aQm%5x^Qk>t+eh{aDP7%Ua6bL)2HvK z1|ylOH7op*K?f$)L-g))%TNXt*_P=o^DBTltyz^Rk(Bdv-;fGIqQZD1Nn^mUjk#=} z`fY;*%%7Ju5oNhLYCd`@6)0{&yxfhy@78={B4~H3w&h)^5A}6U^%x-*S)*Csc8=f) z*4A;HzIvAS#yK9GXM|>P*=^i_ffewM5;^43{UL3La5Q-eUR{+Z28TjV3FuXaHTl{1 z3ZkGG{ySmQ&jV57W!kq7P0oBrvn?wH%xKm5N)(BD+unA&XS(V1GVsoo=ezm zCpV96TGd{vv`Z>{@Pq0Sc42C1v@XOtXcD0$L-iozJp3%Md@YXP2zU$I>PT>Z>*mGC zp>G$a4-}~H2Vn*4Wzr@^KhV=(b95*TWO#UQm$DawTiB)aFB2w)1i-i^r>6U!x|^T( zx+W#W4c5kL$0+*}pYX!MXS)JBi}(cY#vc%<=Mzc}28%Yd8=IzgV^s*oM=Egx7KJI! zz}!SAq9yr|8_rT?4ycv;m-m2?^_=)hpVr}gr97eMY^P6@L3lLFrea`GEcjGo&v-iJ z@-b)3#L)B~cAv$tX<)ZRTjj&EzZ*oC>_ve!*WkOBWO7q&1wt)u(0I7fq0Ul#VzGyC z{vcpKZIt_IV}4gV6X5?_UtJv9Ufl-^?A{mES<@XDM4B*Og4$7R?0U*IA^>tA)RAF~_QnMDxN_R#Zmz zPTCUBug92NCwciPwN+f%{xiKsc4EU&agJux^jOHrUB6lEc;RXC4!~SxJw5sbvar5j z^89F|?>|1r@h@iqYK^#su8E%cFn*!H^eOI`$v901Z5o_I9qZuQMLy~iolLRdqdgHU zxj4L2^6bA}5Y2_C07v-5i|^{ui6ypfu&^;aPj5>E`@Cn?1Li(TaM>Y@W(#pI?=8gaca}vyai;&B7s{;vE{Rvd0#I`4(O`N_0W8HZSLlH&~;% z;e7G?(-k+n%*v^kR|~BoFUq%{OOJ%-s_H*HKS^{fTB$;{bU4)<@L%x2w-}BR^fuCI zPMD37v13Y&KsVQyLitF{T#D39iDXuDN`-DJEto$smY{qOO}}j5sFh$(dGpGjbfa5ZkBD}Ar9al zQSZIaD3)n9IKn+Ebt z3u$V7YWuMT!dcZ7Of7!wO?PjmksCA*=rrGALdC$#znN=vjeQM+$#i`Nja~o^U~q14 z49F~`Z=Vf-@wE&t z$@11*+5Nvb4O+>Wy7vhQ-zqxNk!1P^2pvPqA54|B_iOPYennUi!>?E#q?i`#uo2b8 zmuRJTv0O*RvpACQj;0Rc{91SzY@!1NVKEBtkLvH{lIOO;7waju8C~z2|N0QAJiY6B zU`A4}CbeeZoc48KyV$_L%9!)FRk$jza%1N8v&=xI1|Me$2r%BAL+d7j9a&@TT7&c8 z{7EzE?i>pm;)q~mDkSM9REn4@wxq((Sy+(^=XZVD1n}0X8(~$D70wlkesuc`TY24|Q}tBb-zC!8-A6W>J`M zMXXKPW%C4g0tZPSR^#l*2banIu~Xusqx{MZhuiL@&EGiWQ*I@XCe%@Hvb#@7jH4ki zBm%D|aERSVDnwKw3#aBb=Gjl+8>XL;I#sPO-q}QLQOi3}FlVh`oGF#33bt$MX&P*O zpgIVmQJyR#LJ2vJ^=>)(gNA>)5Ru^ur_{{_JYWm#3d$#p< zed|24C@Nc>zQe&`GbI_td;5ry4NG)3h1&GUbS!Xst!lnSU60H){Th46Q)fcfj1u>c|r;I>)eodg_AzZIo2(S-Fxd-KOG3f z;aFP(UrQe5DH?QKQM#G8@Y*%SR&Im_ZBts?xbW=-&Q5}{mAm{UM$;!jfpGIU?~)fn zCjJhT+@d|^@p2hUII-;9 zv&1i3q_$&%VlxNu-go*$mOeUMYW8G?>a#ZsE~6o)56cxexF9iEf1aaIEEStqm>o_x z3u(;CH!rGH+p?5Zp5>BzDk7V@6kz}z zuA#$k=?!ub5&bb1$u>B*$L|E0+77iaB(jDP()m+^uzLRw zb8j6N$C9{vW5Fd5G(hm+4DRmk?(XjH!9BQ3a0~7b+}(l`+}-sKIeYeZcJJBu?!AA# zBcJY)?yjnynwfs;+fRLyqvZKwSN((~YUn0)fg#=xznNA(GJn@WpXRcCbcoYviD*&y zLqwqg?;1q2zo#ma;hS=%#ub*c^p5_Qksqh_H65(0-_OU^iO4hG!$QWB-?VZpFII&o z3gK>U)X|1ok#xpZA)h!>c+Hn%7f(Ny#5TsC>}FTjDbvIBOg>)9ImT*d*=G7h3xEB&TEIpArSs@eMaMQU z8Y>iyIv=cU~l%1Z?(nYS#5iCYzidaNS`@C zyz&!z8;F0Z9x1yq=1a~HJ4aiFLZ9PUyTK3ML-OojqqmnSjeeh}g@fowK{SR?#+2X( z9v<3VsyJfh$JmwN*aSE_*5UEHUnE%1jx-BuaGN&|c-9fJCb-T*q8l$*=tBzz4?C(~ z5h}W}MZtn$zNe7JbDS5*iaKSSzHuN0HipcYgb^s4*r|Ns~AucjbtchjvdW{)V?TawU|T ze#JODNza)OHJ0{luRY!+&-O+t3y#6MPH7-=t4)KEk$^}nU>dK$ct9mBNtmXY5sK1- z)ca(cM;=As#kYJk$!ejfDY;fc)pRRjRVj773wbd}E?IK;sr6@uMA?G)jRoO-MC>7| z#oQ0KJoA!W^qpU2b|=YY$&x+n>;XzN?rzsYcaWoxOSo`ean0t%*c43{`Vro*yI5Rn z;HJz_Zc!^Yr28H3Nt-L#3}B(EptYiSaY8yWj0dT?q;qv_1*BqZI?@RA08p(CD(4Az<5$k z)xTHBdiG=PB3j{@*^b3pppSvwJ{iuZjEZWT&wi7&4-zg3w#T7;Y4~Othi&V$JtRD4 zuyMVpBtmWKm&%D$0i^)92AjG73g}Nn6rk#{=Xi6Ba3Yg5Ys<1&(}Ssn_}5uu%Zvp# zAMZP$Ej_#-lzXb;x4qDvGVJ5II6N2ZVp#9&uXjOdMT5f!BGuVEZbu|v{cJ1PSrsL2 z)FqQ%A5x-lUu$z3%(DG8M@`p?R=Ff>cHlu*g7TfjFKY8-`#}`J7@i2)+s$EsvWdb3 z#mHB|B71qRg=Azd-d}fZTT4)PXQCO{SA?gdNRJ~)*M^3cQB_z~oGg`B=T=LMHihpm z5PJcsBH>qASW6e=uD1zJr{4W+#Y}T>B_5n8+UcY=$J7!nN3QO6EV{8+@UKb=Y*v)E zglSb3g*?hKDBf6C#lCJqGc7wyk&H-s?@3aV9M8rZoM7$rZN+D3UgRMLs9W<+MI)HM z7nB|3dKU+xH03LeNafvrj`ozn%z-EFo0;yv*~cQNP^l@ZMsm=!(CW2K5?E6`I_-4WwlRGfJ9Jwqy?kHz^{ zg&C9YnVMUNnk*&ScSDt^S(A`l+PJ)a}1B>i;7{hy%Bi!`ne5^^FNBv-0}^k zp12X`-f^#8BLW(aHraF{P>fT^s~nMdznW8zIR=}ml8yZm;@jW7d0(Q2Y-Zpk)s_<> z5M%dn4`b?3ca+z8bqwuJ`IHI*9tQVQYoTMdx@77-I2L2PJztj}-&ZlLpD|)y0Gv}V z_|fD8+se!pxJ@hr*`F1j(ZdT~&Rqa&TzxF1n7T~`Bur>$@tGv;UqrTcaGA6&si>C` z0M)a7-?h7;!ZTq+e6gV-jpbUg0rHFPTD7OPK;67K87+w1w(1ydK&1=G5$B;BWqX58 z;*pB~CGumMUz2NaRrt!P(kSWJ9)(2k)=-!Xa&Th0w<8hH@n*^vY}{a)JXK#X8aLT) zov?Y41(Z0XzQGq*eaVVe=qM|H2IM8YmTO;(iNc|)RBIBXE!cEdbcMFuR)eian#~rf zCbl43+yrN?MXIJk!azR@oUsNn&8RVC^6AIefwU9qIi&h3eUS`(=XGDU*MT5}W6bsd zA%V39^Ui9@#{9mg!2D*jk_iui+^PgmHip#`gU`_wrcYI^im43lMk%H(I^(eJ7q_$D zY8kW0x>)$mZ>GWfiB#gjY@;?;*7IE;Ke8wJRjTGUeP6vmo|;EITmN!ODl56^aF`yJ z?8>fv_+op{hIH)Q$vGrWpVv!`^;qp?b!XiB@+r1PuZ8r0ItQwy*)@q*;S1BQg1mjv2eZjrq*QD~1)uhD_q|SO1B>s9^Tu$)hb*`_ z5$yt=yiH1@^_pZ=N2+2vLZyQHWDOoNI4B67`A>wPKU7144H~VuzOLRa{#dzQ3nb#R!3S;`0oq5H~ANUJ8{eo(!A%7)q(uU~2vN^P@|3-URixE)|_5yjXz*|m+);6d0&;`hw zBPP7f>(+Bmw@K+8{dP+5!VtFMuhSOP?}0APxU{po@nuGPU}{%7llYd>s|toi5A5hj zI9tNz0um9}J4QTrlC316G4ZY6Ayz|kZ`~pz0p>099xu9m5gRVUR{;#f79qqfBHc)tM#H;Fim$oN4!KXMF|WNq$z)4`dIb0j3Cxae0zZI72g z7J$HdcIl)tNg_MMJD1YZ8VZBRaWPiFL+C<$go2Lghs)@lmsBD#s5bt>on$?Z-0oVy zMCa)qC#=tFN!GDBSCvn>tg#kK85i(rXJH2{p&yi$3xg%P`9L<$9uUne$srNcFMxD! zR^3)&N*;d+?uC}t^HSXG;^sx@W$m+UG_UNk(L6oA62K@ce>~rr33*$ZrZno%ubf^jWS%PPeZR-Plko8xm|u z#=!ch*1!b9mF8KRU_|xH_&3k|dGh)2^UpasJ01E++RKG53wzA%Vi2?3LoeAV@(HJo zn>R9OGrKM!qA^KxjoFuY>#OY%dPM!=H`>nV-t1xuQ*Q_!e)qYI}+ zW!N!FGaI!{o0QBfpNVDe{hINCyZAAg(J-6CQix(G5&cZTPpY51KQ{O5eT)s<5fr}p z{S()_`(>kjse!9`zVnqs6O}R0SdD@h$utlx-HY&Do&yl!TX|^hPg#}`)+)%b;aZ~= zfe^ywIs`(}H;13cLiE4g&qzXi8zF@|z(#<*Db(5C7)+a}7$p>A zYU0toBP$#C`ALqTWAB1uB8kO6bivSTmOrmxl?rpyNmR@aDU%OC7$jrdFh5noygFwY zIp=AOzQ|A*FYcH@IEkh8JkOcU7+RwDM-p%fQc|}YA8Vn(XEJ-CH9;JxE@9?PNk``^2^<#aI zP@_Vl<=7;Eo^TIeJ>|QZBFc>vULD(iSGqOVM(h)DvbQ1xk#=v6-7OfxenJw)^dfTo zoC?=p!*t>=!)B3iCa3{g53*7s>KRkb*K86%Z_4D&Z57m{Opf*I$#&Egf(bEvWtkO* zTTg=3zVUuD0GZ+gTwbZ61tZ;yBmdPC$XyG%T)nO003Rr*kG0T^_W(EU@o^G#pCa|@ z-blHjsUG`SZQqW+yBpl`V>2g=1ibMBy}7IYFZ?d}k6|z;`B@$2B3IU21j~8}xu}(% zJYk@ey{r646B}rd1ps0Y18LiQNmlH$WgQiaD~0uMKPvJJc%8q>xHzpsA#@dtXUE3O zJPA|f?fK!d&dIk!t*vw4ThJdz$Ux zKDc$Lfe;r`IM1rf$O6QIlZ4L7nHPxiYmy4&pUdI|h#-Gfo7D?h1!1(ftZr%@nTK48 z@ey`4O`G8C>%i!>aa8Yw3M_5^^qR`^CKC-Q6>CTqte=0fRL$vCh56`-{BgyR`saH~ z7e%WGs&eWpbI(e?3t|8COZ7j%z+8UZHSevO|TH3IIZlKn=j*{B%wieBs0>jvSsb_XM~jY@>TMKMCS2 zW>_;#&V5YCMowa&`ZC`jGa+`BtY4R5ckr6aPEq;Y(_y2A0C9g`k%c1k!Gtrl0mn|d zmSKh;u~}u(5E~M#>N9(2TY{ElJ3{+FzQBvtu0{aSi{!4ipIVbn#6rOKhYs(KZWYCK zg+t|wkIzi{!=>5%6DEDmfzuXQ0aM1dd@I%JS*4ezkVct8AM8^~F1sE#@I3FRm&)|d zd&bmm7hJfB=&EQlz{b9eph;iQcZuw2P&!wf1Ls`WdjEk?#HT$v>BQm_m%7YdGixU3 zHe3S00t8PrBYZq{?E_Mlb6n$l8qCKf7mqd}H??nkDcPkcN7*)w+JjRpXo0KDmzVz3 z?w#<+LVMWuwkG!zh|kl`-FD6eEaTWUNuA@+6y(7X-&9Gnk?_!zHx6}LFw;juE96}Z zci$;jyf?p3nhQFJJgr&n+wM(IqLWZ2zX_{p>yLLQ_!Biw+g0OvPP_OVU#D+vHLjOal-ljp*&9ak`2jXEoI~3R8@DQwbuSAL;P@BceDVJ zKi0CER6xxUS%2mI`PAyNh)a{w0EgZ;C@2boiNW~hocqayL3R$L(=YK^%oM&3gVynG zsFe~;?BeRbi7C}hL(RhENvJ06#bAiS*?cD^ zHzAn4i!Gv^{Yb08>%5O*{_dfE_&Z$#4CxBZhx)Xhdgo=#TJ6E4;fcg47q3C z^`Ovx%qXTJhYZ6RMxU+MOhzQU&*!keXXMRpw(WRsglF7*AS0u0lchBp@x=JVHk0UW z7~pI2`m{d$tP1;OtUG6nC6EImge|SYnkNjklZE1zbGEeM1(o>N@X!`;y1IG_USbF%6)(AyWKA1zo>S zr7n&=1pm6{EJgRQfXvns`kAU3QTb6I@{59-{P#V~!G`LidGU0343C=BRB!FzgzyYg zpZmZ{G*wRrI8@3rerV3GB=G)c$ZfkggwA0UG`j2o7?7b09C)zktOmm|H@BCFk}LF- zq4dNtBIT|gE<5bUm~wKC8zk6+buf%f6Hb;%KAB<*g@r#!Mq6Ztw=e`Gy&{8>Ys5e< z+=LVa0pV%kG)g*`G%K{m-o!qwjv}ELO-U3M8g7;KXq2&KnDm?NdcpB+(%e>C08K|@ zMxB-SDHB=U-H|>jM#fA^+p5kbXtRX=xjz z!s=@ad@^d>p&d-pLSWo9I zX63D57aMTK)P$JFv2n+cdD%w+QVgO=%OkP5YDtkSv)I+gkjCwLa>@dnm0G=zu%?w} z$~CtV6wbMLrwt7S$|hj=&=F}7YFOuT?76P_OdEXRZT`$6psqg~Y5bM@H<=XlR)=n7 zv^oxE-B5VSjbn73T)>d>WgZ={W%o54odwRz#LLFt!OLO1xMXsb?&$S<163mHxw&-^= z9`A07hb8#kzP;P?YkEQA!F=ub@%rIiSq5LCEK*1~$qdY<4=AfxmiYfp{nEYp&HhP4 z{&zOXe?$Gg(UN-q^h^di4*!$-eS<~+h5A*M5mQ%qvq=V0zrc+DPW}GFgPEHfA6Qmk zxnLQ7$NX8s|74T=|3Ur!+X4Tc`hA;|{6A5@Obl<(FC9J|9gso&kJG6C;f!qRW@`%M zdu@&E&1?(-|5qTeos*G+qnVBMKZsz#e=@=1f5QZ;095}%1senY4_xq@-SWS%!M`Ec ze`SN;&eU6jYcK#Ej2VDf?c4GVw`BtQ8~>l)Z~6XsGX3U*S($*K?;Gq3+{YXI`{tj_ z@`mHG{^o^&0PmYCGSJW8!CctDRTL&{s;AxjN1x7lU0c5OH$oQ?5*^y4fQP@0D49M8{o^qQqRE@z$XNd0lxkSI5^qb+P_(Q8@U=->RAEo zoNOG8fZN!cnV32Ptevd%jqDxFOsoM8jz;#DZ@UM6&fiFTfSwg_%>j6TKeqW}16w^{ zTUZ(yI|6>M{SgWLmH_q*2Md6$rIQ2T?>fyNWpOvMxB0*8KL$2$t>|E6W%kF~AC)k) zaRK7?c20Vhz@q)p!G1^m835=x{#%C=1-hAw{|ksO_uJR}4aHXmymdS^fI6_L^$aYG zfTsjly+7OOci1zBfy_M*c@Q- zpXvVJrs=@1#kUh@Wc7Pt>SS%AXYXWXspsSfa5S?tGy)i!0Y8HdW)6TqPbbjDo((`_ zZR2QYWQZb!D{%?1x{Db#rU}gsX6#Wqb_I!qa27uoRzv5QImfVG2y$gK!RD&+LStE6i|FU=)g~c z;;>SXbf}!6MbSCF2O#oNQpmIrT4p@8GFoavxW!cu7)tjqP{cgz0>(z;}DRQ{bi774Gsg+~AQo{=w6m;>X(Bam!O9j0z7L zJxkL3ffpo<6I3Amjv?xnp$E#36^`@WA!wr>wD)=?t7y-&0?cTK4*R+?q=^&4)%I)K zqK+6Ge5Pm>;teQh&)RGU<~_@_B;jTN2o%Jq5pj9U&CB)fRkR+YAQen7X)}1(5Cuq( zWFLfpX;O&r5HA_Zj}Lab??E6ZQM>g7QNB1sWV3xhY>XX<0nQ{>4jFZi_3%{@wDEB5 z8|06wS0PadFyBpY0b&p+9|01OlNW3XaN8#vQS8lY?5UmiFT$xTwi`C0hmsEnX5~-b z0_v2nI(JzWhx@Vq{5hg%Bp@Y4k~N@i{O@EH4+_8H#P`xuR*lo@Be0ax5wTi|712+R} z(Ox61v8~2nS45EKL2(!mEp90ZIm3{Y<}I9i@h)j2S$q}gxLoV1d4`Lr%MOZ^E(y|Z z$V)F3c9BMMb#FN*lMpRN7tz~Z=?$S`2JpoL&S z5-=I-z-C_PqsW=Diw?Yr1YYeMQkp|fSh!c3n;_>SSIWJtn7$$!qXnW<$+O?}G;gwk zh~V0fZkEHd!Upja*pCs>h*h$M1~JmtY91N<5fN~w=n2+?5+8p0oN?P%8s#N&mGW6z0yx%y~UcAv3A_E=ShjEigPRyX%^q886C)bL* zJE>tOi(eS5!=!8h#^S3u{wyDAR=HVU$n22^{MxG4NBfH}=qy;#xFVV8QXti@{jx-h_*r=7NDt9CuByWI0be!A{@|`;tlkKE`W&sd_a$vrG|YDcMj4{?*fO$V zptaweH9y4WxKsICqo$*J!sJ&dk&>Bh0JKGiSIfplrO2zE@Lq9(*!ed2M zkavH>-a3&Fq53|pyivbRvD2~~Lm$6%%joW6zWi`!eb~sie&0w`=4yq-NYN}*3a`kiii6VfLT<7y`L$~S0Dm`q z9$qjp{pxoLWuqi%g4;C>d+=RisLD__el$x#$93D|3(N*;0AhF}up1Pc{ z1^z7RGgUl{wPr|}4R_26gKI;6XY(hicEemgz1B(-<7Q-93$0wpW6<<(3b2)@_yEO$ zNKwi?j_-?1>xYX-DTdl{@tKZ9k zviG!31t~=uUtOE)@HRf3uyt1{og>d#ChSzXY~0Y@_j8nLmC!BskbaXd4$&q-7{Ba& z-lYvs&t-(ly)4seC;0M822rq!Ugcvk)-(x4+HBO-%p-cPNWW^e<~@&L5M9&vv}L3d zd#}a7)yU-M6I~L*2J)5ng&leYF{rX*Rr@)c7spMurO0E4a*ra-lmag8q$AL4HSg`( z&L9XdQItC4A;UAUur1+Z!pvwmDQL(Hx)t@4t#tRXO4NrOa%*tt7MwV|G-dG%tsTiH z#-6pCf^w6qXTL~z+&YhmDMDRyzf3v#nx9-XPv!D5b`{12OcQPDI@vi$wykY3cC^M_ z;n@=g1=_%eJ7Pp&FtKQ4!tPh4TMj7^l6;~wjpjTMOCSF^PFe(WvP}0-o!TkZH@R=G zQyx(p7*?e|YH)Db`h0MSv?912_#H!EV?~EleT2CFQS+P4tZv;(HNo3B6qqE znhHNXg1g@5vB5Zbs=S7jyYuk@2cwTL2m=?;zdo02JUVk0i@#I_fBfo2M$9ZZu)A`s zhif+j%aP*q?wEY7?D+!8CPx>Nw7j{` z%%d%TH8FoNG*!;(55X@=h<2qnn^~8Pmm{ z#_eP3iQ_~C3CwJC82bDOj^eC(0#5r6yL~I2*Nl#uRt<$3}Gi$}a zWT)0)3k0%MvNAYU+5`MySx}T;VACF8(>0`s}i)C-=;;ZJfOmhq%K0Y2cWUA}@^3i#J-b;>bG5_cdiu z3-^;-_bzN`03qlC@%f%ccs<@u9PJcZ9^xZi2~@K(l6sV0egp7d9TJKu1aVi zHevGzjfAy9Kl_ zS>$h|*Q1G3O~W~MwQjwAvDEikOVY8Q=Yvu6o;u5NQTb2b#>)_TIz8~V!lj_SS5)Del6yY*oWwvWfKcm5iSiRC#d^~d;_`$7yn*CP zRQ~Fo+gHbMl#bVn{cgy|>N~u1s6u|ichFvO?l`1$*DBFCS0ynY z4WH>vC@dHpX7X-l8!8A-)T6knW)1S91NKl`0x6y=F*84e*#Gpn>jw=!p94)yD^tiA zzS-f6?$4qs_^eqyEWw^N86QKuV62qtNnF89hTLE)Xz;mT(VD&Tg8tC|2_DMx2vj0f z)pKw~*s9-ew2L2!0@pJ!({B{gAk`FPDvx1|BNTFD3}?0)zI&F*rqf;32-|+>*f95< zS_dmHYqX{@Z!ZQHGTQ{rP-9|}=T1}rbX=H$gBx|C4bqHpaZ{>8e?zh+^3X5TD=thS z-^QTX^2VwpqZ3jBOgD6PNAj}GCqE4MhrZnK{p0Vm^9TlOC+_7t=>ly%l7-^?=u81v@}y~m`WpJl{E7%EL*%B0vFuB#9nB`Olhg zWNAsTl?2^8lH=QywBC zgf8qo;zwL2@CHYR_~N4OkH}EkZDF{7&!W0QjPjg)XEp0`T$o>;-UA2bR=^w-OLu-y zH*bz#Ro4&8SIAe=kGe4UL6QV+1_RnLKA;4u zNiTmhXz(V&{wc}-cY_AMg;V)A5#`Uh71`cqp!?^b0Ua>(&q0GX-5Hqof2=|jgyi^y z1c8GFihnn^A_MK)M0tNzv;TX8U`ukpGbYO@PK8Z{pvZv4;b|>0jjf-xAheE64(zH}D^F z{hLD(r5sv20=H}|tv&ihb=-&HRm5h+v z0y#c&qsi!%{MgZBaXzkJFM6trwrYuP(-p};2aP!n?luEFUFR4Eq0Z5=x0 zew=cO{&@Q6zgmBaY{(RO4LDd3_0HP4jVp#rAPBusq*&4RfL57 zGWq4|wh|Dm6E*cYI~0@3uN@H<`o|YZ=kwr+TmL9j-(gx1i66e+AbTR?l#~Ma^7|bi zSBVgy)`Ij~OSIeLpw*!GDR+_2d}LtNf?#(aD0xBEN>10D-eKZ;#B}3=H{sa!wulZ|78OSI`ER*Cj$vHfb#tn+CLi)KF;*Y=zeg*YNjLa z^{71va`LpA5eG)Jd!NO(bKMrC7zE+rlwSfYQ4svPZZ9d2KQ@d9(!U^f5Z~{?Yi0lI zGhB<_z6XfEH~vTZi_{QhMBu-FR>IdXXK5YKaEQF1$FFyAXb6DApZvieFzt}o5yVhF zY%_CwDPG38q`Ks9Zvl%x^nuhqn!JB68770ZoONrLDTCljp<9z_e#Em&{Y37VQgd@& zI_d%&@frMs)_rJw6E#+8`S7h|Z!OhJFS~PC&g58OH61m)U+tt=ubOaBQdTU7QC|Z8 zP;^{0&h55%YcJ<2wtFwbg>K!}-p6y9#n_DW05zYZB^xD|IpdR!)H!sC^}~zdu}40J z2Qecdol(Y(>V-}1V>#oO?>gSSopMJj@6ocoJDL3%6?RJdRX3v&d&d#=GFKOEd1PY@T+fdPlcqgNp+*FsG zN_Dx2Xr9zHN}AmCGD}sti$2-a(xh_LM^{Z-49#6y^_;9q-^Xr>N$Vu5ITMz0uadc+ zP&t0xwMXWF$bdu5vNe|;g^4708!65SB_^mPVI9q`%08O7W-v=2udw1Fu^#vIBlAx; zHR~Vp8P!m`jpdFsEM`8__Ps~Ax1T4x>C!Zs-)0GWaVBYeUQ!k>c&A_?CKnracru23 z-${C`fKc(>Dmh!QJU6FzDcy2YXvj1`g(@q7Hdy7033=~qsD3!bff(LAIEZVQ4bn7v~=IM;aAl{u%O z4mC;XRs-cF9aP!d=ppn{4?Ci>gbG{SZK$DywAew7aw|(webAR-uFl z`kv<_dss{T&c_W6rI^QJrBnIC&L_NIiMYe|*&J==NnaLveGTQ270&$g(;BXWB$OTD zyXk(Og|HT)Ac=f--|4C{eKgZhCNKVxI%YWxSZWfNJl3vscfO9 z>sC5+7Ge{|8Mgj{WmSQZNA#n03WvV?%{#Yu@n!z|ufn{+cR zX%(!v&13&40z?~uuZJ?9mUo5Wuy3g`cM)!&nX?;Py+!;i;QQXE#K+uyuKiHrN;K&4 z_2!HvU6WddK->P)SS1cu{BaYTM!sLGOx-UhlH^v6jI9hyq+4c-nU<2hybG$Y)1mdl ztbIv%)~STOwltoa8+0fn-@mH@$m!LKSUymj)fo-oeaS7@9?G{a0nUcI(jz+CrxJQ5 zw8c|{4K|};Lb+2xYCnkX4TE7{<(^E#nwH=oM#Es426-uxQ=kUUkbrk}Ax!Iaf=y9* zWKyf-NL>NNb-LxJ(_g&`6~lg0#tm<3b0!^K5QJ#j^sxc=qg!>6v)id+UJ#>+1*$ni zU!uUrN~1|uKUQhcbXQN^Q!Co=$+6MBsDmfy$0qhe84(A8MLe_7M!u4V=yPO&zA3uP zN|9i~-VUm@uXK5?;tJ>w`Nr%N0yC|F-^e3#o75r2erE1!>5reP z!q4Ot-f5t(%o&3R>IGrBCU+zr@I7g2k|L`qe5&s*Akq_s_M zM_I4NiQk-EZ?%x!FsZkY8EP^o&vYeGwA7as6)Gg7YN1R%q8X&Z*l}?>FHY^K!ox7G za_n*FmVA0#<7_C^>sNdA(;(wB33kIhwz0OHaRWV(pvdIz3VM0jY{^ARlKxasGGgys z`}~DI{!f`T0x)4~i8(W?M0PcZa|To&J@~k2%uk2Tw8!cG)^n6ZN|Iol9U79ewz@NQ zgTvAj4Ek0qq>tsAH;=m`GheWtzBQK#@WZ5gczi%#_t|?lRqOR*1YC{CQTZdks;HIH zYg>FI`=EIYem(g5GlsR5))K8Pti=H$eB z^1)`#D{-8xpi6;krPKvu407pRU=p`3t?Jt6Hojy{nIiS_sFX(961GuJ&+M1;YNoY7 zhFsPhBFQoS@`@s&9Hd1LomLce!uvo%--?vIqc-v7s?kZ9wSF4oZ}U(HLe`!*7>Q!G zu25-<5o@rhK^0!+ac6PjCu?U7Vw}nY`8b~~UZBYV$n}o7c>Zw>Qq0S-%*gHMl7&>r zvza{ZD*MR8v`|tZ=RuN$C8L3c62mbcCyPA!W(fq;KL@izt%Yc!z%C$u%+GMmv-CDz zZ8%C1Pyb;lzdU>$wMMgW?Oq56v^lVv_UtDvI(pR3Huge#aepBK>nNmVZ0N8+pU*v8 zg_fI|=_h-C)$_Tbbx!SP$F}?4P<$+%?9MDdFKbbH1N(SPD~lg?GkAoxJv-ETl%DdO z%~p1}U=rTF)Gt_yadg+kVL*ctoK|p8FVn2Pe|d=x(tTB>s>?+-4P2q7>PDJ`GVLDN z1?HwAEtoYZL@2xSGa*6VBY8K9IIQ-)fXr1P=n z9lt~q@Sx7&s#=taoNHh>BoHo;UQ>edThcI#8mR4a|c%6+r5!wr`&!dC0Dm zTxu4Z!{x@Xeqef#5Xf(IUMVu=HCvWD6Fu6+eexf*T)9gO`thh( zlTHEKo~@w|=pi!=tw}3YB~|Xx)^9AhW*LH*H;7z@58?LcSJtVSDJV2>h}9vtUw6%l z8-l7xH^F7-Pbf?%3l?yQaB$Z!E076<<8?@RH`|BwKt4Av1F@AZjX@L~*82%2IZY=; z+vxR2uRc!7tn2!nfmQo{)Fcm7; zX_EX;aUxL9*F1Yv4I5FSJ9}O+Q#5MwYVfVp@XBnb$wrzmkDfXW!9J`HmQ~x(C(e>< zoXWe<$8i}y5+|x?;zwgFS~Vit6Wg}6zSNo5;@~`2RZ>;wci6Mhk`?2he0;BJL;v(t z&t*cUG`<=Ov3(4Oa_QxUbuL~QS`@7IGW3!2!Uzm|K_kcN(2dlsdDqv-#_+~5NnQ3R zAW9Wr!Pss2-~b+L~-I%S#{L|d2{!51C4Tm&9?IYO;@1F9L1g%vj)8T{067--!- zoND0wlgM(k4=E%LJFE#{l4Ty`x!AQPH?LmZbl!g$+6oq&C?;_5GR+(qr%Wo**Gt7? zF|94avG;oB_teq(3IooF=t!Ut>WWc~v9;opfu+Bbacuh-5DzhnL^-v5I*@Gpn^t2FRW z7g3hK;)MSu3;-=H|Dg*2>--;a!vA~z=?}<>?_YI;x2yTT)}4jnt?__$2U>svNxT2% z{fAb-%JQZpyggYN8U6=|W1#(q4)HH=4LvOj{hty6&<~V}krv2j{+(h#$IQe?_unc8 z^+t-CqxIjzTUt0ET!0UMi9CeJ7RaP*P_VZ!!U+TlV`Ix`g9M@fBjdzKVg5tah}%o;%oGI8+hIeiie@X-l^%E7KY@CE0rs+aUN*1I4qQ zp3Tf6?Y=XUM&#rUpcF3z47 zO6@1BYHXE*-PaU$jx=|I)~rmI4Z=%3q8hvJAg*zsoNHgyl5u$}PLpEV=6j+?P_`n@ z#)H~V*}}Iw^k0Qs^!I50CcfH%HG=RK|V zzFx*Zje|zLYM$}P+vd(Vx0f%ITk_~s z=IIgYkVk2kXmfMt@-Zt#9g+DoIz4^Mqfpmq+ih*dCwIqs>{M&yS_d$Do7C@9lRx?h zoZ9gWBAMvv36vfKx=P9lmhw7jD2pbb01BhQJW8eFH04kbURxXl3O$m7b+U4HpF6S8 zAoqy>G|rv#L$jdMU5S)v);qRdA1&7vCzb`NTWgY;Hc6F>MZ0f}aNPV>HmM!lJ76j) zTG*7&xhk~DZrqOXrQ(#uO;9cTh;yZQp}C{9lswaL;hkUWzoVa13Sa(`mdzt~)p`@)Z1o&k6A;A3L{a1#=o&RAmQ%!( z?RPRJ2t{kVqyBW*tJ$V^Cg(&WjH|WprY!cMt0C>90U9oZQTyi-ZO!6I;>2CNTHLE% z2E(}FI9WsuViq_*Zur4|Maq#-CDR7j0tg{B*moFxD_#w4e%u))xdM&GGyNLtb->Yj zo2Nl-g^mgX{9$O)S+IJ}%W!nt7o4aANz(3*WoBPG*dgQ$_db*}xRm)e9#V{uxj3aa zIRbKeTz2g!&_V5mzX+X;OE>j~?dwSYh=a`nVV}pgHl?2pH`Ix~?9?bJo0RLg_;v)L z^+R{Cxcsn%uWGldeT${pYs+d`A|G&?A2>)L>e1dm>}ammF0E|E@#H*tu=MQ3DMaJU zNuCOVQ9g*g?!v3~tpTSZU_0OoKHMgMOT+cVX)uNy1_}U_=1c9QpO-syJuZXZC%bDZ z+xja95O_^I-=SPRq+%(B#~|IBffp{8pR3Ehb^RxT8v)@&E7EB+7Kh&PWJ)|O$43ca zl6mkt0uWC5MvE)(Cpo!KRo_e-ys%Uk7vWm4RKon4zF^!J?n$I=>e)c%CW~jAOh=g^ zSej#W-^$%UBFHspuyujArD)KY>5-OFU4x*J#{`2tKOfFc#ehgSE>f0Aq!~V=IwKdr zi@n?~!^jZ)f|S1>#HDY5*ANmL9wmuyIn{GcpyfD}O|KF7KAt5UwUe}w(tx~d_gG5N z=SkZ6lU|Q==qQb)2zhp6Q{Ix3-GIBh-BDZSP@LlNp2XFgTk`VQKQYXtzDwn7FpIZ! z&Xa~;lJrBp#kUkKQ$y1GXE)};Inlg4BMb1+l21m?2~~A{nUT54BK+X)nftm$FqD%g zLiV`-i?(+RlJt2KwVTtnZDZQDHEr9rJ#E`Irfu7{ZQJfXJ-`3%p51u&oY*)K?}x0a z)LofbPdrf-nRQ)OB8a=k`!EQSzT^f;BLk8f=MUG3R?R8xHk&M95EE(DOeh$iyRsxI zYqUo3TvFPUGM`H|FEnzGQq^yosHdlk@e)I&711P8imTW&k-NJbfh$!3H&^ws`NGis z`1Tby%Rj**G$oOGx0p?@^;1=6cB{ZK<92P$A?82hDh{RR_1 zuY>k-IaotA31VcUS#pR*p*Nx(U_?M8cB~>Xf`ps|6wqA*f~>iynlZ-ZNA6G_1sWm3 zkLcz!*W(n|ewF8)vv`*tw<8uEj;2(sjMX#-Oh@557dGcXVktZTye400IeIM4MAcf9 z_LzdFYM^;C({)mWaP+-sUDmUWm{Pc~7xJAke}N14EP+43)4$bUQC)Kzit;)`2`#$@ zJ>-pXQ(}atI($oX zcw0HW8$ksjR8}%%f0+(=*{DWH(B3I4xNd#D{3!u(-O^MRc~Wtm1L!SVIyTZ&q2s*D z2ySBb6A!4D`f1n{xFgz^iL+(bzT3^O+rTu=wl5efwbCJ8Iem5hR5AXz%~M5)1%?sG zV!za${Ff*`ADW;AlOQrnrK$7=2>^C=|48EIjs0A(olathk82uYds9qYC>b~o*2mag z(scc9Ss4y*B_&svY1QxIcMKQKIU+fC9a@^BG^T@Rm$vlX{?=BSvs5SPVv@=IRgei? zp9xEz(sSYZ{ zGzD$CguX*hC*ulk7uWObINj!4E6+)mZQCK0jb>Ph_a;5tYQ?AZ6rb!Mb9_%&2Cv#d zZ&Br zzR_zSy;sodt8C8@X(tY*RC%Z1^rOeI$0l#|w$m60;u-(sAh~Uei7wP#)LzVp+55*9 z%P8S)_GPNk{aJVe*<(TDUZ}L2u_(3rOuSLMm|d zLCr(8sas(ENCHliUsZ38fJ&VvI`s#K<<(rKThM zV$Ol(^jNNF?y)}w;0@>n>Mc^0ln{iwR!L!a%p@pTwQlJ0BGMxX@4LhZV)on!Z!78q zo{&n6A)`jx&xWAc-{QP2C8#_q~8S9G?#tRIKIrRx}T+aQ~2{3W%?q+~i9 zQ=dIS{wys(sC;L*oQ0-+sKw;CJi*{!dG#U#8w!isLCm#YA6UN%SakKzS|g{P@i7Jv zM#2nCt6UiN@bCP0PMih}#`FmPJp9puYZ~bR4X*ZpFA3$+;S0JWc`ENi2OspNA|JMv zR)1Mv<@QjiL0Gns@x;Yq)k%hj3j+R$;>_kXZ%MoiTiID8_{%#(KXnpKa}3Z19~d^VnQIg=L`bC~nz+L0wku3YvRA;LH86cUX=8sBn_ZsK*(ULELpnWEI+A?Wz> zkcO6_AKNLsh<=NL$xAt4noIwEIildJ+8ytg-Uk^-4wRM(J9aw9ZirPFiHlPW?qbbs za;;PdK>oZ;adZLqjIgv!r^=Z{UZAnHk*?jEes0yf;gd^{h!4*(bY?F1ed*%6l5&Uh!PWjeIsn1*`FngN zj7G@md1W4R@Np>|Rg1sC8x?+IGvv51(A5xe3XA;{^`t%8v)!tS9K;n(nbiU0QLS?E z%H}XVJW4lHe1h?fi^F>fXU)ql8IB@yc&{Jct7#1HWBrru|W?$Dh%7>T?-j{ zNAMQnB7X&nAA_ozVWD0J8O2aB%4?IlcbqbXvf3T{KxH7DnlQUD`X(+8C5%5k9N!J& zR|#MLEOxlBbsEmmyy%~9J8lB7T=y!9%#J!sHq zExkrT@D>Z+T=Hkvw7T%K&IgPgLfxSTC7_QajdM^q2|Kp*QSa2yGWjKfPXSeZ_5d-e+S!tJYhs znRmmCG2@4_eM(#SBc5oS8kV_S;?*e=B~cM_-;jO)J;6n%KC*0-BOXaDhL5MS!PUAk zlRZRj+skD*`wC++{l2jJD_!RKAq^Xv!Hd{--*fJ;o8X)b7tt7>mHR+KKJa< z{VXJv8uhAvF=l3PK%(3Ci2?^C2zAzGE0Qx6pXv8~{3xCq0prFFHO=?xz1*s3;X|{c z#RK~dO?z?z)Rt*0HaJv`RijXF7n1t|f|;s&=$<#Na{M;#$;<27Nc3JIGgrfu?=Z_R z9F=jovY(7j>p!l0O);Nw)M6HP4BR+>p1k}G!^T(q#hkvP6v3e|g}diCW*!5lqZ%`;L!jE|P3Q7H&4r~{ zfUKQ4#*@Llf-lA_LZ$Ds7%D=rh)5U9s-fl2H%q=)rjc#v=vGUG+B1!ND9iwb%r#(V zq@E%DIb0cDqoQ&kCBdn45YU5h$XycJH;>wkXAs8DTi?{W%$)5aHZo0aBnW`ZF5Yfq zNtAl!v0{k9l_+xq6`>AHh9F5;Z2R`w`!SkT1a-+q0M=yhB6}nD{)wH(;N&^b!aGIQ zw^LUwt(83}L>lP?t#DwxUqufw$}D`oJ`A{%SEDG}(>AIleM}PF8VA;UJvvnzGWD(~ zDt8l`SD2~+&vGL|LWEqb2=uxAvQ=aP3PwDPx1;#qgGC~=|dnRLJ*#8;p4NKr+PiISZ_E7^Zdg-vha|M;qz{^ zPM$+Y=m>JQMh#MWmr-@t%p!sQQYFU}txWPM!=^^qwZ(~&5)n?gEPDP0@#mU^x@8P~ z2>WvJg4KsFs~4w!uAE@B`^3!GnjnZBewWxhot?Sd@xq^0NkvzRmy;hUUGWjq1O-(- zwO12`9kr^et_~~TRIIitvH7&s_2iOvT{hpWVsq$M&9dqk<=c;JovUrlOFII+z5K+< zi@*@8Khsw#jNS=XCfqNTp>rDcV$-%)-tUt_=nEChiGR|lM1qDe**vaql)892FdU*% z(zdak3Ejom+A9#yF>lV85}EH(){@=92e6F!!(!G=yh~l{yI~7AZvb~SE~{1;7AKC= zd<5?$35{v@kADuN!e|#kT*)3mbng{w}Rl@i(rdv++P1P2_L0Jw~VKDOgk*1tW}w{0nwe4GqbVmc1w zPj7m@3kYK}YwG1s$zwufMUN}7*&n>;;zn}5f3&q zBNI9}#d5?m<|@kC>(Y?U0);q^{Xr{9gB z#lnP*jK?m1QZRz^K>@+iAN7l*#cwAE7{&9HgXs{_zN(#N6@|0tYSr7 z(+<;6Em*ZOzqUf$KarvajZ5}adWVxIN!3eCh!e&zl?psYX?QJ0oyo8TLULF?Nsdd@ z^O&mgAc71=lJh3A%VE8Cp=A55Uf@%6GYosq!86h!!NO{#?|({y9Gz<1>8nhzeC&Lx zQ!gI7Lukrio6l{jMo6wNP%kgcwN0XbGb8|+PCr6ZBd@V;fRSUF)Yjn|hO@F+#_)c18Wd8A_I88hL5o@Z+Q5JPM5i$0$#H^ zjpqqs1s=g&G=nOh>L&F6@n=Cc+^hBX-O5PUF;tU&80u}IJ!vU6dooDFZ?CxnbIvk_ zbHpjjTfew-xMn}s8cO8)`xnA4g|Zb`tleb~jwCOo<2?HS2~8@ zV3>*zhP5&FNRw!aQy&mp_%^0&&SKGt%{_}C0IS*f5k59UL29e^I5AUx;u}7WyN?u{ zMqsSO6*}CD<=V7IR6hl=GXxCyn$5j9(9k*ub8H zk0SO!#<~Tb1_JaAFpGb39`P~5LwFAdXSn@z{rteB6m_}Z=35ba?yuwvBKPyC4~7k> zU!l@}@B7g4!5PaN1NOGuMoP@jlFx9uv3u4F+a~~MSUKLC(ur)jDJUq-3g@C9eNC&z z_cUF0vZ@J89NdRO@u*b}J%DzfOHNr<6>qN^ajV-I=&2^BM|HX{+p;y9&L*_iS9M-w zJg#l1cgot-wr0~GOz(ZP8mmDEjH^oV)V(+{$tKOPm`P2T&PHFKWjzYcTE$%yY)MWV zIS#VN;R&J1OUifhG1|ScPo{oYB+{zTNXv@r86Dpq=j_)b${xeWbYUUa@g=Z8zUA7n zLq2_^HY$)BtD z0{%7D!uX}uXCLQUZ6g<*qy?PHXRC*Vc>DLxQc8T%ROc4Ob$fT?#9=2zmMyCG5t*DK zEJ>9dMd#En0+Y020f_OCkqd4fLHzw&-$IyA!U#9(w+ zLRkR~NJ|7yHGW7fH%A0QKpYS&REY(#ZN6O$v!5P2U3~h!MTn|DCfK$QK1&rDXrpeG)Cu^=k0&IS92Y8;Y`v7brZvL zfK9`SToDxdXzGX)^r%Jm7_DE|Zh%C%)ZVn_QI__yI-7B&Of;-n;#2A|>viC9H>i2q znxhBFS~&gWys8G~b=aE$avO(M(Qi(X3g>V`D8&RhE&Q|5oL@N>Emru=yYI3FVKld| zrPTB1s<7|sHWT$!B_esDSB!ADBctpd(Oo2TvqnZO1zuX)h7des#ntN+R&I&0^Bf zRPTt@GztW?&RWCLZ!yY;`VBE%^3Wr1S0qW`De`ItAhAjTPY`U^4V@+ zc}Ly2R}KhB%&g4L8>OUZb8)PBM}8khGkabQu4t>3lSjG1hKvEGf;wE-{i)XRu-9o# z{)L;FWb}u06+ITGsbbJCWYZ6yK&YDkg3Wkqr?gp zZa>Wpwj@5|R_+_afoi{J{Xs08KLc!Z|lv7O=Ri=b=1Qsv#>{}JoN(2GbBy(fqf ziE_puM0WRaL8wMv(-~y@vCJARZ>BA6P3?k}z*G5@(38)Uw#4k+uj$pPK) zvudU7)s&NXSPAg*i}20j2r5eM0fP4sa?{rPzQK?m)D+_;NY$V`)jnzn^b8776KGk3 zwO?%!t`=UqY3pXv>&8-rxOD-d30J9J^CDa|_koEA)fGr_joYuS)k3p;)7B9a&mAcuh~#MF z+9NnqVocuRJ}@-&hpXxSQHwIeIUJdt;-^fNxbbUa2E=9mV#n3bczgS5S^*xmnn6yH>XxW-sB%G zrn)(>XUnDqjihM~mAaNNyjcgg0A$epI4|uEz)YdOH&Xs}j{#RE>cmW-z4|PU8$7`4G;u` zwP@vpCMOcHxv!%B!FtSVoZ?A!b35$N{Tvpg8{tTW_DaITw@_zDql1*t6DZ9)(8jf0 zeABce4d%Qs-WjbEwW0(!2~eqUN^ZLInvpl52q(VkVv}DMD{Zq*La$6D`@Iga`F}R{Wr6nIve(WE-$@ptm|2>nS1O zTVQ3Jqy=ZlvW@x5-8r$9Dm+J2Zd+uMFdwBp;eEzZZ;(6P%A$W%cW+P_$Fw(9?2ula z1}ffMgRD;_r^p8>^9IGQSz%L(VFnKyzA?vNrB+ex$p8syZnr zJ!`gqNObvxA4i8Tk`+5eXBqUbX%j6y!M7^&B-2>xq7;ONcngpMq8}F8X#qDsW4v(JPhCC6rmjS-HP2wL3MA^%GY=v*eFz*Em^4TI( zS=ZN7A=Q5RwkpH&x=P1&9@A`Wh1;oyy>8SW+$AH2 zFI*K!k$CwXx#2+mclYM#f>QB)$zj0!YuDCq9oU2D7a{t+S|W9h`O+N8zSKImUs>9~ z51YI^4pZp&vV~0uYu%~#7`+$(53EYWs~_lUn?%ev3?1bNjj} z*TP}`1bz-<2s|br>T@Qan;pL6t}zrr zd&WcrQ*M>|=?7D@`6TlU)y%p#%+-uCT^x^|@ayKo|=zg8(x8NtRix0W1gpeY)!lzcz|G zC_uBnHO=lt%j)TtGvyUPH=ne1`=~BFv%8>Q)1e!RJR}ouz%N0#H9!R8rahn<>Dxoj zyR@#45zQ5q$d?13pTkxGy`3`dK)?IWYS|ert28c|FeBT|?E)Ya9&Lw!?t>@GHb_K6 zcFW_Hm09Sl{l*kE%IU9>wzQyF zb`Efs5T`{M=te(B;9_qP3ktK8T^+l{*90Mz8gi zEv6n~OyY7wo7=dbN%AH(?CdT!0bdWi!*Tk~A0$t;5D-cZ3MC~Fe0@|-!aved7k-~p`E%DlRdOJ%6hsn1L;kMSA zal!rrXn?YLxd@PCfbBX%fb{mwzE)ILIxfhiu3IQ5n;zg#xlIHSI|ADryFCb-UeX83 z0|I{*&gg}#G5EG)RG5ZE>9BeOIf4yGLvQk~82-B%C!uyop3QkI{n>2HknMhwGSlQ# zA+4xHv1u;wHY2fT<+Fsb`CWgGtAoutw3gTr4V zb9o^+E5Gmx1qgBRRHPf_B{od%%xdjj4jx8*LWE`=g#dQYoYLJB-QZ+Pr|9uJ%Kz>TMt%gl*eGA zDbsz9%A03%uKNe|a+e}{i0OULEH|muU(A6;?F}h$*HRPmT!g#f8ba&pWXAGxy+{ho zH9t2}$dIM&e)}R1+eF^0=BTJIpTCUjHeRj+A}|_lz{qhet&&1{VTLfO$wYoJm|U66 z?ntS;AvVb!<9XmP_}Y;MB(XI24+lwO6e@Y3>n~X&UTv7{i_g{$?}-NA!~Zl}VGe7t zcR3riv=4pN+pf!JUxZr~T3M0H$8pXe^mYikAns8uBi>*5K1f^U)>cx39)`qr3P%#o zX2=WKdOc6?eNh`nTV~Cu{t&|j?5+sdV}NaDq|zyN9e3x!@iy0Mv*3c>Yr;frh*Yy9 z1SGX(RloRHw}fJopYpxY26IH2^=%PD=Md07;nw9^PPme!;n|FKTxY}RU8x_+pBkc^ zxWTByFY_ZmPi?T)U3_@x-+O$3i>jV&fGlx%VDjxXer%R(pD83p;t@ za<%k+c0i`2&@KJL4b;{O>l?X|e9h`HCDPeHa%=RXENjkA(S;QSh`%Xuxtu@PpVO(+ISrj%3Cp>##O5&mMwN&=2M5{R1T=uu0l#A zuDe)UK$wmz0=z+(R$d{5E19H9o8OynTFeB)!k1HfcOgSNXQQCP>(aVbO9F9xQ$iRH zn+#k`D1l{Ewl12Xj)Xc()ClWSy2iL0m=6URE_nBOlSD<@yan3+H4E|lE`NsgS_2Jl zTMFnN8t6h2G#-FV?Ay>`DANF*3|_t7xUnw+-Mi4GV*4(b=mzHlZ%# z)eWLQT-!uc4w3c3sfiJw+Gq(98ejwMoQ6&;3~|5hU9(KUok&dRpw#!%0BAYxsO*ss zcu~W2^MvfuMem;G(9|S@7zloh*@CL~42b#~@pqDs|LM^l7}_xL(zEzytE_e_JjL^X zfvv)dUF9$*-hph;(|cU#c-&6pVn_>xmZY`KNddoxQD!N&GWr^)QoqF)2CmKOD==HY zIDsTM$ z@tFt9sWg}>JWvecV%4QShZB~kCQx6=A&708bNMEOjsuPdox%lSpD_pmoH|_(+6tO@ zcrWVGU$L4PkaTU1gqH)AW_Qg!Mo@^Htf`+gYB*X)D8gJNxjDx9NrL`LT)eAXA&3l{ z^jfA$683_m|P^X^ftuDu?_i7-6&Cy}=5q_^v?7e7V9y>v9)z3}?0*I0-M&V!C)7%JP zf*%IPx4+IMgE<`0jB1+PHinAFrM`>tB7-$bJwKGwGuyK=+x3m<3o1}E{LY1dk8jph zCSQ=}EkRrSh$&=@PoCwQLIapNr5xOXg>i+2sSD zyA>a}7eM7Qm8X|+ag8i;hApT+rx5fmG98u9%(2>mqzx#SNC-)bqP+_;ctwc4Gs7bm zlBMcy;?|x(wcgmF&+g%H?LJIrMf=Q8yfqsAFJn|qZG%X~Id&WB#3qYsUiL46QY_TN z0lxUrEiyYpJZ;c~P%xB!XFpIhBpM$!WWXM08Klbqs^w>m6|O^+)e5>KWt6Y9YUJ*l zf;T}ygyQc!(p5|EB*QD$>Vbe+GV3O2CqHF}I~tl>>VSrfGFMMJU}yc5P2y*~ zK*968C7%z3hMg|S34^|f*wCi!PW~f?BUNhRaUook_8N1@6Dcf%A!C;`G<}n( z^^fxQXR^s{ZbRd*4sgOJuTvgefu0dA=o@VzkVioyT{E^I+Slg&*#y{S90WhBp{S(= zOT~Rg^%o{144gt2{&Mdh#FSA8e0;Ca0}j(w-Bp?kds}RF~a+}PI08A4tBgdghXzbPU+1WwJFR?!P1xV>8-lo=UsDN+!$=Mul0F8 z-Pfo}o7t*2nvFm{k>xE5Vs497xP$sqG?b;IrOJJjjQq}(t$?}T#A;xor1DuzM>?`y zICU3w44uGoVJZf#x22>Y#0nwqK@tLeep;%jTi=09M0Hxv$jIGY?zj@r(!>#c#%^`2 zNDLDEzIp;2&-vcNGh$ArwC^)qvD{1hmI`jyYZNefkiuErx zTO8J$BB%b=U9=TGX|T-Sjavl+{bA}tkvbg*GL9ip zo1@INfkU9a3$3a-3Z)7gXAo;pY{Kn{S%6Q*#tiOV%|~Q>6fCSzbT&gWo7Zq5rl~vm zb4NnJhr*Zn6Tt=~u*8hllOctn<@?ka{pGMjr zGjkFb<#v-F<1C@!&wMZ&{X|x36aluqXp=>+Q!vxZvn3kZHOB(0cBp1pg zHC%M5qd!K4rf**UjkH;Eob9mg&_k)X#`KCj_1f#56iiY@<}g|;V%rE#h;cer472yM z3{9z;f=c}QcmVr)(DFb)43Axbwq3};>BNIUMIAd0nT6Y%oFV%A6ft@jPXFE|%~8t( z*VeKV`X9zp%wT%{Y3FpVhUzFLCSRrUnE90#C+)NwNql=M#phT1XU^nYm+VRG4^fMA zK8!{TV}?zjD$Jf06jc$w`b8zoBJ0xCWx7YWeEe>MNQ=?bfypok<);tbQ6%IkhE#=& zj_$jN&q#m)*=ZFqDvuiT%>9)hs1eab5h-O*Gs~Q)F3E~ipSobSwU&a_g(57KA>m=J z*?`ppVt4z+$_bmhrV298Qy%E4UQ9PKlx`?+IMNI;czzdz*7vqp2xpgrMJ1@DTt{qT z>=s|#Rd-v8xXZrP3ZtWYK7zhH(tyVy-#h4v?hkxx zqN+~{*tOdZR-O7*ts+uaChFmuZ@Ov&^_wUr!qky#CYo;(SEJ90NN z;{-9#`Us(?e*C0rNgxUk#<&q6QGjuv?66p=inNcLZe;zlKXkoTPW%L>N*$Cox13Sj zEtx>E%cNxHEP&Y3KLwDDt=j3d{=iR07?BSHuYe(fj!Ri-KGW+$O*IiA5$L;u52;Tw zFEUPp>FeGMsni`<5hxge5 zjiIoo>b%mONOgFMH!v2nl)^Wyj1cX;RfN7hcdriyeu$x0I2Sq}YFfmsuR=v~-8602 z3frd(yQkXN8EAj^7P*jbQ34`YQdG|N;BhUCY~}o9>&{1Ij7U79DI(j3iOP`Es1C?da4J*cZ;E<2?%%Kl*cp6b}3 z1VCcW(HH8Luq5-t*udOxQ#E3U0+n)+^#^O!#7DkqW^;bYq&7mK-xjL`h1MM25V@#~ z!w$q$t)$+Wf8f63IT_s;^oT@Nh}kU#<{>#Nh{d&!3?4#AaQlL+_iq;UoY?o+pI1jW zsp3r@J77`2@QmCni{+0eiCI&KoPhe~F)2$|DF-g9K~%Jl5bWvy)%S-I>i4A?+ksdP;mN&Lw`EbIN;;-tPICp{y?%6F1k|?12{W zCL@Mn#v}YbT07*?Wq*#u8{KR!_>>Lk@5V^QyF>k^SCrWt^}@A)Gk`iiLrA+k{+iLk zH~)EQxK|l;4)%RdyY}RN=Ro!duc-taY;NK>Mkv`Zj>u6%ZF$Hf&MW+iQ^c~kF*-t$ z{4F9#ovSKs0&HSp*bP(=F=YMwg9)3!WIJmd*w|E_FlcC3!6xFz@*RpL#o(=PC4Y%n z$GiUOt>K6z)c`sDkQ6?m{=rFLI&g0NzUbP`b1~T0C$je(VAI;npe}XK^9=v#NaRXl zFBKDu-XGE1!FBtPTLgAuw*}NvC!!7|z6$&^sDLOmMOQn8TXr0Mi+KAN*va}sxs?51 z(#Z=ZWe%G0ovDWdWKnzmjz`VcnImq1r<~j)GrBK>eVQaxQ&-UV5c44|EgW#rH6S4~ zjS26j%;K`93i6(uQ534Q(@Sp3?#K%ELhA&dQ2O7 z=xt2BnyLeXu884-MYf=qoR$`>9kh2_)tLG9+ojy2$1$h zYWFsi$8J%LxXs!Pu~E&S4j7Xe^L`YKAsV%$OuYXPrlNR+hmoiki0UJl z8=_D487?KPG~#6v!Y~Ek7y*E+>mHKIj`R)cnSVwjaznKFtMQZ4&0^uhQP0@-7XCTviZ|-VgHQ zMEAYGXzGIUm7QNW6j$Tkr!%8-Kc1~nr(ixnvbeqlWIhMCK`@0GI= z9rH$B-E3|8e37K+lLswUP?|%ziN<;eB)^AV8r61I;Jg}iF0d8yFqoN` z-jM(onlVY`DECmQ%w`e!O+eegptuATX+<=iq=0X2W#1RCWw|negkz6AkA*-Je*}s7 z%*?Chw>~b(Y^jm~F|cnoMP`T%UL?FwxSBA0Qj&8RbU+L_%I=p-uS~Kkvar4`YQG4D ztg}CPYbhX~bhPi`9kQ8ZNAEdC6(%W)JUd7Vh@FEK;TXlc{Q&Xn1}^W4p0@f`=TtoS z5ZLBKFn@xlehr(2msNP}GPsb9r;Mc&J2&-~JsGM-p1Gri8#BnnwcU7D;6K{%0a2hh z@~cleQ|i{|*9YemN&y!U7d0#AODN|yqcrF=S-ArA2yG&S#w0AxkJk^E_o`OTJ zm9Q#P;!fIx%6eq2X4@rC8VOU@3 zO>Oz;-?dir=P?RI+mbo$odQiNWe^K%8Y8XU{)=#jL~( z>Xv~4WfL~ZO^jt3wzz2~VVg8iSl%u!AC;3L*DydY5uoTH?Cm9Nyx!M#vBVb)QlpX5 z4mfhEL<80E= zrn4Cp4Bd@c((HT5xIg~E5de%{?YTdyz&>5t7HylhvEUquj*n)^1G_!WrzP);LpjL9 zzfsbw{f^1=isLZ6ih9ub0ZHM8EWmv>;Bsfj>cBU!Yl2}P{52JKR-TBXmzv^7&SYMi zKRTjEE``@RjYs4%hA%1ByvlUz1b-TYpRnj-lCM)9`dp`8OXl^n9tUB?IC%duXjt~Q z6Gq7au?-*M6z%ZwT(ND5C^LW!wwX#IY++I`YHM{9FG#@Z{&?rDIPP-4{XH`e>bs~_ zcAaPAW?I%u$Ak>&txFbax?uiYHzcsC38(*3Tz!WeJ~BOkNGr9&HzI z$>z7&*u~SbAD8kH{$gMaqBeg5k^N7sFI*#%2IYpiYp2F9VyPETo0bx?huF4$G#}+4 z5~9=>op+h=lF~s~rMfc=(dQrUGGTJ+O^Da)qcOVPEc9IDs(756Uxc!;!zfKBT1CLy zS_w-#i*%0ij&{{-cWc}f+f4$`HIL!zWLWHlf~WpmJ2gBz?_3T*OsJfsTsSEaliP)J zl_tEVxXRW_%H`zmEGhua#Cg=GYaqeKxuyQz5W7!6N%l2$10BbXWHFv>2~2t~d@=JL zegwG{w7k>?Q1fyDy96ih)*-$wnZ-Xwm*52^bL6O4s(ixs&wNx*Hfg z_cpek-#qRQ^lTK{3UwT~h59u@9ln!gUPC89!<*=_&q@`yvjqkB8ieOL-(6@X2!nE$ zg_esvrUPRw8m=dsUjVCty$y^$DZwml$WlSiO}*|6Zz=S26S7fl#!zWi0y|bJlx=MX zh9Q;VWg6Y}^Nx^ExxkF!Vpu+MjyDL3is+BQn zuiGB%X*|0HSKItoR)GYv{?_Vq!Mq5-{k$iIV?8z@TUNMk@RV zA@g5Mi~mH(R2EZ`l~VYNz@Y!8Q2c)w7=N`z|Cs~9NcW#bM*j~CjQ{$6|1AWA<^Kl3 z`1Wc2i-JM-4Wax$(lP&w1?j)F68*b@=pU)hzoa|=t#|1EC*9D0H4FVen1udk9-;qD z3H=|7g8nN9u{fh&__N~16ri1=XZ2w?I|Hb+EzdbUrvi&36`iBSd zPoKXfjBM=xBszT7@7zBn-*x}q_OGDpf0F*T{~PyjjBj=+>)#9Y8}lRKYjj+z1Y9CcK`JGj`6qc-&m}S|C-}JG5*H; zPV{sP-xdFsq5F@a{`(OAZNT3P^VbmecY*#sGk!Bt|Cz{l{+~(y&40)F`}*$!{wBr%lgzi-{7KRZ$AdD#l?pK+*p>g1ONF>A( zLg0uU!ej(_$?$nWHnoeN%C$>R4p%yF%Xgotcdb`P?v;CPmrt%OZ1*srDCcyIVoK1M zWZ+1C;=mFdKj`!TNI^jD>?m4@cG!@AR6q|A6auCsAVbSu+X4jS0!V493&~?r{@4Xd zpsU=xBnK14?k?+psuKs2wdHTkhqqWwP&Ki$tb?6BQ3~dmwlp_!{AY z&eX)F8`ccY?^yrZgWyK|lU3kjPIIAeMGfupcJA|t;6oJS($D_!v+74gco`V%3GA`% zdCcYU@5VI3uhAm^dO^45_qtMFf6jb(NK-HqVt@}x0X-!-Z81(SWY`_><-W|CVO}TV z)yr&x>!U{#kdU~VxUjI!Zk?wWlV5mI0(%kdT3^l|EAM1|-rpYYbvbPx5=C&xz#Xic zsje@zFN2>bOh5*~0()QrQrJFiZG9d5&m-OO=-W`hvZkB`Xg>G7U_s!y^la~l0KZ8; zeYgj4?(aB+g#p2V_I823D833qfZ(!}ywhO$73Sq9g%{_i5wDe^YYq zEr<@l{~6>;G_)lP?UUmz*q%7{GhnA;x{F{F@(ydaV*R&ZJIW(#KOX)iYrp8@b6~G4 z)fMl}H}FgjVef#7oDdQmGQ0n&o2oE5Ghh~X19M;3x&hF2*dxQ!Dr z^6idfAbPKB1vd~+n|Kx~6yR5s9z28I)90UPatPTGJZh31GFeC0*aD3;j@vK>N5a(Z zmTHZ$$lsNN=gri2gcFD(h;JVX%9c`fTNgYF7rIRa5pX7wSuV*8UYM#A&Wuj&UCr8@ z;9A92rFa`_@I=#CS!WdD%s-EZUshW_g|byvOj9j`_Ij}-r;coDd;3Yo6&W)liTW&> zh1sBw8P+B8gosS8<_e48r(gqqtcMf-rl9NaH+$4&nGQk{;!Y9yR9m2`_7J&$`X^z&(HBBI6@B zG-hfiQ+eyGmYtB7gLMuPUV4X#VO>aY!gn-SGDOuXZksVhm6BzlkUwgQ%jVqg_wdjZ zgp=H<{mE#s<(Q(4_Cl`(acBcvoJK4&KCRoWnf(F6{ilWZEvBC`iKmU>jlf`h&F!Oe z4(lo$aCea!gh2t9M#lE+i^?0p}!9Z}u8rY_J*P`)rR@o(mvT(v&w@K{2`X5Gb2^(a z%cdfQrR6AVO=R%iOj}#nH+~ZFp-j`Rp$$piNW%*T_1U_u>KWV|1&o=bXz5aJm`Gv; zaOYd>Tn9;2e_Zu%z3}D!;7VgvBbJP8)U6Nwi7;PYyN|GsD|_O}E*mSos%FD~q6v9e z_M6`=t#e1|IcY+l5@V5wZhU<-U%x-O1>_)*(sb$ErSBkU($L{5rn=LfZenWb6|lnX zvq`-G+(7Ji8VS1oMd$yRFrN%u7?(gGnWjHq&S9`7k{>ZSScD|LciMs{p!90Yh;||= zcJnqX7(qv}fI;rCRSHmN5Z}nrVjsxOx*i?l5FWIZu;+-yL8*l+(LNl~*)(oRe4#ZH zPhR2qr_DRh$zy9mM|pps*u4-ve0?dmSly3$$5JYFeoYyIq#4vehCOJHeI>LU?1BBb z&4AVqbq_jEi^hATCNs~+=vVkhfvowWktBOOE0>(1Lk1}^GeK~pceooHi}?)b`6?l2 z{ziOyvl$BniW6z@EEPt28#hZ5QU<_lqqCr zFb|m;B++0fNfa7rBL8*Hxwr1wyZ8P4fA8}=pQl=PpS9Ood+oKqd#%0C?Vqo0_wJ9O zTgWf>_iM)v@2;F3<6kiOh3d)j?Jrx8S~z!qo1tNu?$_!vBr9purDLjzAzJ%GMDzY_ zzO!)9d@J8Em!s~K?~9!nsr=*0U+qubnwN{>SxC%ja+ST3fOE+E>RM66!I| zc=@U`zx$WjlyD+0tDKR~-g{%PWo*PD3#Y2F^MbPH&UcBtdb95*=R>{fL+^1H586Cj zf8N|j<%Wm0Pg0CXzW1$$Rctdt-X);eu*~xDn3o|}b8VGhr7I6k&9rOS{pOR|R+E@e zo3N>?&bIz^bU)`+mh09fIC$Zu6Uz>I?YJ2hcFlTM&b@t(Nt}28rWwYjc88$Y+`OaD zlOZPq9yWHX+Olrjv1CD<#Z>JXm*yY)tkkue^|a~Z#)kJAKSF(B7h{#9w~T7kdyPKn z>b!Myw5!$_?L%*(4>MU@cjKT>i%vejt{TBq)0^}_&^*~(k=u7(@uOb7M=a7R$@|{$ z!Pezf>jv{}Jv1*Jy4!6~-}Iu`obYhFyz1d+doMNHeIS}q>2xhwpMQC*+xl%8mz^)& zo;0(paMtSQO8L6$Le^Ya*%Z0y#cq{Q$B1!LLs};fasRW+qVd^@?_G7oe+8>b9X&%> z{xgm~%p0gbCz&4`IP}?+`o)eRU3dF`7tFELxWPGpLgo0x%<)%3zg!AG5NpnP8mDzL z_wACE!>`^*y43XAT+7wX`t3no8(R}Aef?A0V=I$S8*ZO`Z`l{KKEaPYTtAr4jqaV` z^^@V*`lLpeS$d^gxM|~dh5bHdVPnRnkN5Rz$U1v#z}uL24qG2w9U6FZr|0l@^XiJ< zy;L%M?Qp*A<-3shoRPN~<#PL6sw_Bes;@KOP3OLkwL6eyXG((?2y%Rz6p~ z=HRZMWk$JWCt3EY6a3hFj805iQT8bNO7emg_e&c}#szI*cwJD@QZ6Xd(!D+YjZQ(K zomFAH&F0JdYFy9u%Kq^&%II?b?D%chUJqK+oE-hDUsUCdzvK4aPkwXf(9!O@@}8*% z&a~#A8qQ3bq}5J-$St-0)0G&GVpV!g1G!yj=pTN?B5mE z>Z(?FSPAbJh;=kJ9K1TZzI2T1 zDisaZxpcL0x{f&ILQ6qQaaXNl#+weAPucazLOB0};ug2UjEn2jTTNe<&6@amM&h>p zsTJ!PNzGSyZL1gQC9mt2u&LLLl{^2o&VQSqG=2NISJ$ub_gs5qWXx6Verv*vYNp-0 z-TTt{pJu0B^vmeCR%kfD@m7|H*6-7Q?I*nPEE)f2iEr8Vg=ftc`)|k)Y_>15ex<#A zZu7N+&(C@+{E~V6j76XKH`djR4vxHaYwoWBi*65jcszP@zvJgmB;31v%PZ?n`FqR(bTh-PWw%@s^`>>kfr%Shk?0QD+D$N(Y$4{thI31q#DQkgzzk*czUhaP8pVQlk}$!~FYPfADio@HiW8w#8>rk*UvY)1>m| z4-aSiXXd1xyme1RLWd8{NR+_`wQ~6@AvH@80}h7?Ct*b z@iOy0rC)h*!9y8|J1_J zz76}Xkr#RYt?nlM>U#F%ws~o+Q?BN|4focCO*^R+`$9$OS=4#w;eW%ntYt9`&eeHW zMQkuhoimdEnHg*PaHqDyth-8oLkoH^v+_5K=9#74)yz=v2$~!k*LZG}z1zc$ONO3( zY-yM=NN!nJQfcoM^VHI(M->(A7iL6dJ<}Qf=5k=&j;`5B0a5i^ch#q+81uJ`(KcBxPAF^p&S zDV}F8-CuQylQvX$7_(J=@D@?;l^Z+?veeCleuX0yQ(l^AUb-;VC0kol{fg5AKmFml z`n~rAm(RK5@3%et?Vr!RHkDjkS@HB+Mxn9O?F0QIuDrYu^eOd<#Z*OidCL<%eGl=N zRug81FVDKqsrOxOFmjIj13~Zwqk;cE`c26G zzklo(@-5@`?GM$TpWL>hx-igT!(7jG#iq7P!%YQe*%dF(=IsxEbX@7g0;|%jlg$bn z)m9$q6B8NT%je~nb?Jr%f#!FwWLvG*e{ITHI_H}G(nR$_rNA1S6HQ607gwdEj&2O= zXS%6+sFv1}q}WN9#K)9Ra3VEN8GYW`@3?)TQP~u}Ywz@Ph1*7Rmo==l`s}s#e30vn zTZw55Q|p@7<8t{SmV@Q3-c}#%f4;6zSuP=UqDAwvnR=fl#m+gJxoYgock|QpTur`g zshN{vRv;YIXP05~Qp?Z(u5$0B-7GaU+IK2a5N@TCxg=rfOU0<1R|z`t@4n7=d=sy$ zbwV}E{pYcps*mLQx-+X!{j_swU8(((A8BWi-muEMu-_K{r)$<-$+DSaWUZXy*yrDb zZ1utU4VT*%93D8MU{rO;ii}@n&VTw?$CsQ>oqlo(w?=Ez$)#%o?soNwYpI{pJgwi9 z)&ySOi61Z2xDO6nCLg^UIpjs4=4QQLRsXCqlNyHp)#KfbKE7Tn|7$bDG8W#CaPGsa z*CQ{C$`;4=Jy#k1B5{YFagUynyiNO8_j3GFvT(}n`nm4ahIhKY*yz!1TCL`s%f5SE z+v+uDTy75C+S0FUyjRm!+o^&@c@-jucZRH&E#`xkZPUxy{KRR)uSFBz&%W{I!a(bn zm9L7Hzq(d8pnk3XGI&>U|I9;7mlDCz)FVl+XZ?=*5}Y49eUN_NF#$obdwt8&5*UjX zH>MuAEB7|(jYmdNhRek{(OS39gxqtAzws<`hh3i|y;K$~-5>lUWNwsR@RX*TC8<-C zUIcI^-F-JIcIoEE!RE$mpWj$HNsl{1q$sz;V^Z9;#cWgSlzED9P$cO5!JiKERyS?5 z$s1Sk*=jpO7_ud?WNw=3vRaPDku;<8tr=!NpUi_@*T>^6bFSS_9)Ce?|Bz$b77S;- zj1|U}rwp1j`r7?>H6zbHKfB;}d`;^7WcN`f{%3|yS)lj#-qZu8ImSa~i)~*%UNqZh z1=}j=!q$PT2QPEaWDYaw8@Jy5eDuA%%aKEmCEv_SDEeG6;_KV>XNxv!)eno%%Q zX!(k!$Z3W*&)m~KSHI8d;?jUa?=)BH2G5OI`RL(}T;{!136TSaToAAHcij;d$ji92 zx=nFC|M~0H&mvfh-`AR@u1uY^D0LaH$2R6~kIm0+HIB$h81FbK_0zq!dlP%brE^wH>S@R@=f*I42>fx@2hT& zSGgP;y4=wCHs`{nkNQE(-L%Hi{<5~7;^S>%TIT~J* z;XSqPOZEM5wfq+4p#`Y}wC}9b3O}x0upl{jaqyssbg#|tdJXev8+iU~^vz7KF*2%>HS@sJ@HLtYg9vMM3SeT(Qvu62_{ox_BRL~JZN6^JU6TK;Zu$9XVd##8S}$iW6}zBi-|M0=RWo}_*6e3BIfz>$J?sx zHGG;LpZyX%>d-7<%k7GX1Ml3M`Do&Bqer2`i^q)Rk9qxg&xGd%NA)j{?q@H|)KrL3 zTAO{z%=XIMxeu}&*(;rVgr$}&|F^?OKHVU9{=(wAm=Bjv-3?P~>^ttT;F{NR>s>=@ z)%HEiU+DD9_F&?pSMgazmFCeFJ5;@VMol@kKHzYXP4Jr5=6r=C_vZbou+zKnvMy%d zW+#S=f%E&{R{x&5^tgEU*6I=FbDvHeH`eIkVl$VlIZMx6cl&U&EOP6%zO&qZm=6l} zi=P|XGof|Dazmr;>$ARnF}r1OtXGfdp^dDTZJ8g|N2MM0{;@m4Yx=+KQ*-~R{E1^t z6RCgvE(+^gQrf41`L{)F8&-wlh-JUb>wm36@p!Z<6x5{Jt5DS2#bv5cGtFntnzfLu zLP50(sX}oe2Trd-Q52{`kjd`}J4Y=&4w zRslNyhBha!RjVABP-k-UTFxY2%kCTC#dPuV^JcoZ`8zWme3=H!xy(h(#Y_jL6LUG! znYjYK%54?-MQ+~kRc^jaKjvE5atxK@mo3K;wFyZ%hC>!SsQ>fCL?NW(|I}}IVMYjF z>qb$9JgRs?{lzEW&Q5O+XLX>IB7K=V{WIb(NpDaeB3kmuIuX<|;CD(UqK$|Rl?~!k zQa&iZK#7Gb5|BR$I>nU_MHrd7hHSx+dKWw!>Mug#TL7IsU42(TU4za44|NTmNJzaV zo&jFv=Hct?&0rdOIQTjnI6HYQcb3=Jm-q4Yc6L}LA6Qfq1>Y>U>c-Mp~$k8ZhY?c*Cq&ADcpzg%odGcZ7g51_q&0@>>DbpmCAR_C|m!qD_c!@%z+@5JA;#t^1{>p11x*Z(P%Or+lx~oi1CZIp+OakUFjH zx64L@<3GRuvnzObw{+p2l`C9@V;Qwmw${BgY-S94q;WK%?}zRI^)uRbspstoIl}l| zbEwCqooCWwH=W7)(fTLVrQhrmYYNxvwORa){ zi^`w*-Y>f}6-^!6ZR3l!@nr@ZKmHq-@-zH)pBcK$Va>f1{g$*%iy!!Pz}WA8t=$~D zy!orPb)d<{wr)G09-g}Qbl6|`#V&+V>v3c1-W9|D^-}y6^zYt3eYvk+hpC0IH8rQr zi+nTV@YQ}@4umZu*hYtI@7We$~tuKeNyF zJCj#j^{#Ar^5#9&;n@duoudQ|=6%F@vF};4aDe1<%s+W4Z z6Os~6_V#_!n02b>y)8=;POqG$@8LM2w&A^+S;hE~%T8U*dC`rnw=`kc=x5sYht3(C z(ycZrpENMYWzqND@lzwi4k_#2X_(h#TU8vhyk^VhMx!IKvCp0-rZse`dU};H*!-J!k6k2|wKY^Ii^4XpxUiE!`d`=iu#sa^9h0 z%$CZuLFixS+()gFF&~;I1*Z>S*5wI)G)1|RsEr&Al-d~ z)a4ojeHT9CMm%~N;PT0Ctke6UTS|7R{TzF{Ys;rs8DpR{f5Zx-7XRdgQis#8`Q_1WE|&!}}3t6#V7 zx9D}WZ>Gb9$D0dQxQ5lutVrEC>D;}y4=U@Ux!syBu2+%I@eEW;mOrJWr_!bEK)v3v z)(2tFgSMJX2^XyYTa)gSbg+2&E7kDIz9*s^6egbiy>R^N85L!wBF}JUNLx(#S=W?* zOLps58*9KD(~@?Zocp{tWyl)yWw_Y`JYOk8Sk!E4jh3&Snzuky#PIq5xhq4y9c zRu=c_T8qOB+v-abO72yS3u!xWba~vfkKteL@isrQ(>Qduv@Gg(=0L@s7aWG&^)dPR zcuVuf@;eXKrJ5$^Jw5p7k@lZMcKaSQ^^%uUnR8PA=+1tHLaU#3SGa@NRw5QJWX$#rFrdJZ{E88+Skg3Blfhu zA9g)wQpl>AdmjzkJkq_}1hoMpN3Qb>%a~xC6IfMP`0HqXne|bZ`-(StQxD`78UB3X z;XnIwP?Y_^_th!A)zfwdyw`D`TcjJGTG$%D{l|5t~b9pS84T?qctdJ_1v-5 zX9J@3RgUW!ROQe3*h6eTr_@R#eTco9bzyC`$Kzt#{qm!V4jTk)3m-ky`{r-GuTBb! z{)vvJQ^w`hLF$ z-{duahO6ec!tzX)&-}Zk>r0!IP3*+?Y2p1&u51atxi0w4-M1GfmN%!&-=-d0u#9;) zWtsJ*kXIi}SeqiAimyDfUfOgoCFH~G7sCyw%t%nJ3_Vv`awSvASueTJjWff3O8rSk zwd{RUPx`t&^;*-MG`r+mMECmU4aEZ|RkVmk^fCE*HQsH?-RQ43dNf5pto53*Uw`k- zId3BtkC(4_`@3}8^9An@Z98UVymB0;cfL{gr)`7H_to~y)+oPhsW=+nRGDCe%KzGi@rL zn7DlVhuuj{o^}p?AUKAIUxU*TbFW?EPl<(DkS`XlX0Y?%78(b@!&r z>Go~5c`vFSN2!>uN$mPW;Ey!|WFi zxi$NYO2p!WVG4GI?oY$CGpnMFx8x;UQZ%fLuvRDv|8zP`P0&>G`OW4Bw{xq*X4WcC z|Mc@dKgsRe&=0!NNxX)eY1>1U&d=DuIP<;WM|eth zX}@nhYkhaQ_RGzP8QW))i7Ic{B!PV25#G(8?-{!`2h50$J*icY(#Cu0*kL)T zr@~M4%l#~Te);%Xo!f#ydEG@Pa*rGj{eGZk1nZ3DT>UWhEfuqKE4@F1aXHVkDqM1R2<9-=EXb;y4PKw;r_+uUt;mN&67Sm z|D1NZ^tx5pV1CP_^Rwgr3k8GzrPepwB(p+|hW2%8S}!*=uC9Bcf9Z?1u%}M3zfT)G zzEO{Qba(BztB#xMG|w;x?R2@JaCL7^cQ2!Dd+#VIhV5yXQaYX8?4hN7K1e;ycYf`$ zLre$VU+(>lxTS@ruUXsb>bwGmGaqEk*qdaV^XTv%!~Ij{O}e$w|Nj1&UX{V67uP@2 z^0T?)_ws4#Dvc*w&gZ9P8Fk$-{i{W^xtL+knB#Afs&_SRE8FstryO~>x~gAW?QXd*FT;B^ifZ!{^GcMB11qn}Z8_@k*<`Kd z)yu(q`uyHr{wsXOnI&VDGmAKjzw;V``r30w#zyQODmI+G+Sbmr_O!h19?f4yqYJs| zGZp$*`G=^S|8xAW(&Ny$j~)?Lg|j1CweCGLJRkg#UC~Lyf zU2bzvGqX$5xS7Ki@n-G);j>96QgLAduIn0ByR+E7evkVauHuUIqsPP_a7#XD$u9oz`Hz^lkL~;E&r-{aS8UfUk7+C# zQoF3?%)pBl7Y^qJC#OZKj?O6?)pj$#GTVLPo>jsAe;=B?x*1S&dLnz~#3IvY2fp`T z&|J6m@uSx}8He{R3-K6T|MqH$qJmb?D3$1ACAy(UGTJf*Uw5qX%B_ep+q&eS&GSZ9 zueWx#4|dFLWq!J>V)%W^s;=G2V&NXJ^|o1gb^2k}IbSaCX)2!4ef*Zq)n%_HOfJsv zu2ynjp2Ne^k^zOGyAKQW>P(deGQyQDN9DicTK%woy?W}nO_4j+hAva(tzPn7?@REu z>+!o{)@%u!|7)qwhnk3{7VEK=aSg$*+O9voF|d1q{Qg^c``=CI8lRVNUan8rh_y-M z5?tfHh5zmHX6t+1VJm)YO6py;YeH)G>}HXlxc76vz31lfz0V)|9n-|V6tvrPwLlnW z$N8o-AwjgF&%<-xzYUjFZ}+_Yeg)&lD+Nxv?=8)lfwdJIj|biLt4#c{_mg{r^K2bs zj(uJH$d})=uJ8A|eE(f@(JCYD`uF~Rn-#8=_sAOJqrIT8zx#>5e(wBbtm`^!AO1|% z(@f6KuCnb~$h+&+fB4Z618?*j*;vm!T^;3cQ(3to`&5YXbO-G*f0ovs0#LD_>2LJkzpXKfnHSiE_bmC*7@z#uKBNkt2`wm(M9p+`dxnYx0++=RLbU`8|K} z+r34Z{nXA5T3PVLvzYmK8NXFAY*6#wX07T6ua7m)ND++>swpem*L~fuU6M?)X7eM^sxBQ$_Ghf6T;q} z>2kKk=B3_(Q+dVjW(^P=dBDubnC{|`&$Rtp`}uoh-2}5Gyl<1^euV9{Df}R87#=fw z!4vhQy3GTGN28ra%0GFbaNj$2hO?$k@czvARv$Z6)Dz~@mkR8mx zm$yrPn%SP+wyNyt^c?OU>p}*nqTiiv!NuzsCcoZ<`8PigSap*brFuYTm$ka)$i`-- zqW-MQHfzoH7pIMUY})$yp0CZR?qbv7yDAT+s{S_B-?w9O-Hoh-M_+zr8CcC}o}B(R zOK(Zks!hi~T^_e2wfF5En)4&KybDoR)z4sDPa63u+xEiCtSb@1z#YbB+SOWxyJ}Uo z1&y5e?PQOxstHq9c>Cr**)}w$HS>x}#jj!Sw+!gLqpM5BCnG!eo%wH`{vECTp{~yH zl);%Rhb`BAYb+PPJooIIR@TMo_3_v5&C36M(!|8S#5O3<(cPA#aUrnfZAnGX)a~c| z#m&c#<&HP488 zjar`0H~(^=z~f|%%FigXHGaEmOozBF%?K(GvI|q@6scbhx3lb-w{%g;2&P=07p^V- zrRIIoV;J*OqxTrE8#{lq>5$RC*-kIEl`62d_b;hB8Ft6!pG!@;GP{}?Ju|9my>+rm zsOKrqrl!hC8*a`#@v)+twPjj~U_@dCODTC1C-g}5$vJ-psOA3a`zLPTYTudnQbb`> zRM!n|P#c_^5!*>FSoVt=|L0sVaSB=bot$hoWb4{f5`=NsS62W9vms>i962)qgh}w zt<0RqoDa!gb4dR>N|L`GNcz{Gp8h3Lq4e}GVLkFRJ_in?LlTxRZvQ`(OqJ54fBm6Au&zRDA^$C%ZDTF z@Eq}zq{CT!nRKs2Bbf^@3msgYedL)lz5G0V8Q@3@9lV|4HzAiuS%d2syDj%&*m59` z41Y2>V!{Mw3@)3r7K2M>w&8CPSw#RbNe@~IxnBl&J7GK?q@_tS{+~PLQC||v;89;g z3qL6#cwEx0;fOvdBj`?Eq@Z;w_+K^U3CLSK3?6(DE1@Y*DEV8eA>0=r>Ey7P$#%-8 zUEiT*^Z%cDd16W20Oqo?c4wM-~0Jofo&ID}Iffxb~=Dh;A3iAK0DXmlD#tX@uOKBz`zvLG> zlbBh+qo$C6M~=O$rb0IH$bT7ADEGC`Q+lV=n9-P#{rwkaT$x$VBW0D^jU#bOY6`<# zAZHZ}p2U89()ZwR(j91SDdZAz{g+R;|zu(O>f4atU>2aKJj0;^Wc^n z6}cpV3<4TyD4J#9TaHl~P5gX4+&qbhXz1qc196ZTLuz@2cq_3r6)eRvL5>60wPaYi z`Fc1rI8?-tXHJJ-Nylo}xSi8NZ)blf;Zb}$VkSjt*H6MuGB&`D{Mu&_OJYEj9qD-T z%mvPYzR)%4+p@Bf5e;Duixa6R!JK;FKQWhRLNV_|a+*yk$;sj=hzrcAsQRBIr~FGQ zITd+jC8tMqiaF(b6myBQ4o`76qtVkePYh8^iF zD7%g!liD*D-z+2Ei>!v6EO*I(`yiNt6y&lMFo- zMzlDzUJ0d1}d!@#OLn$XSE+hp}i3;uHFjLFqe`H6Sv=ma2m6bz$jxz5UbZSBWPt4i0 zK#5DvCM<|D?{EP)NkMZ^2|F3pNeaS%f^wwl6zuqq(n%r$HJYTNFt(D>Bt?TisnL}F zCGjY>tcA!81S&(vXi^a9KgmEINon^eTtV`4ggJ#>Nd+kYk29xKA|<0uVbYaQb{(Th zZ7$l`(Y>Dymu$)5pqNWTk;Gn7MJRho{7CBkvJsR`?r=~U+6SFYL85jU+IuCvpH1Eq zmQ{(O(AlvmfJ0b_O(E0&$WGP;D9Px|@tMkod(EU7fH{Ssapt6jI+2yMAR;Rq!fIzn z56Fo5rE3&rerZsk%+Ho27ASX>Dk3$%Z17=s0;Jd-K#Gk3DYmp%%KR7{VUrY8rH;`= zfE3D3Ha<|2(ahfokYaZLDK-M6Q0BC;?L_iU#N+mBP_?Q}>c0@&qDMeIl zi5k*KL-X}c5EZ-%qaKa$7~Ewu{*(2Y%0Y_ znjXPZQr?v1F-ggf5yQg^RV3&D!9_H?OJh34Sn7ZvH!f z6oR9qJ(5Ppsv0DLu1N=KLO_$06Dd0e@5oQ-oH_s#mC9^iMWrU8IMFs|GzBuR}x$|POeC>uy5qyVat<6X4W=n-JI} z?Sbr00--u4K1rYp-T|2q#6;sHU4}_}Nbpey+fHCm2MR(!5S^_o*u|vn1P*neAp{Ib z*^&Zc;D`K_u6GCYL68q^z@$z~`2lTJmOvtE^rVnc;=nwa`O^td>cB||OrrNK8)zl^ zb=bTU@Y8{P5a>f=D+LpzN)r7#*meSfIxr9df#_^yhY~|W3Q6Hyv|$Y3O$`jVlP-KTegfI0vWf`6oW8X`$1K`R|f zbe2JCkEtl~p`v!j!<}Fo8E7NzS5i`?mP#@jNY_Bpu2QT)89Hq1hESa@TzekjKV%Uo7o$yUDHxzk zA+csB(^^QD(xlxH2M?fRtzqEhq_xP`!P{38%GM-KVQ9>8@$&NZ^zwDqW^2MVD$-eL zRF)=G14%t)$sA}bsfx<5-~yG31+r~s%E5evQz<3DTkM(3V}+^T3Mso}K3VKrRBnn>uz#fXFslCrY2CDD+o^|n)>m84$TP69PW5<^LP z&;}jZQhP{gpdnjQ+--jp^kYj-4z$xiJC3A&*iHl8IFj;cI}J4B@FkiNFLd;E^YYXd zlOj`*nxWz1=IZASLrD%MwU1~gawwvNfutpuB1*OG+g20i~`6UGK z3myf`q)iA1q7bu`0=DCm$24GsC^ld^K3U6cr-0>%S0VyvmbM{0LpoU0Q-oJYjyy>C z5FQ~p{2-wa-ay4_DIc&GpIROy6mlpfE=MxvfD(MknF)#w2bADbtGDzaLJ0~cNGXI8 z6f%)g2qh?xC8ZEbPykL!A(W814b?lLgmhw16ha9K`bwW7l%SazI_J{t#U*Aawe65R z#3j5~a&UrDiwjB!sNf-O1AGKjkdjhB2>}&er4&#?K*eGy1(Xm-g9Iru7nBfCtEIFJ zC?TNPolDF~YWCl0zMoAwUwI)WAN@PUI9KXN%M+JBVO1shvBBU^S_0b`U`usV_>2K?I(XlMfmlMBpinCmlq>sU&f`g9uiT935$YoSfBCQ%PHLwV`*(c@LSEghr^I zTr!?X!(Imi=%0-$MFtBtDi)9Ej15Pw$kCE=;As=RNn@Cl$|s@=TOb+P4l2O`)r?Pa zkQ|X|*Md*VD_sjZI1utmr<{~3AbXQ8e;rh!H|pj$qn)pS>~=q* ze*y+?*NXlL7`f|ZnBVfp(f*c%Uo#(d7%@;wb8a^G}P!G^gD-oDp3UVcfo2ahn&4?%@ zZD!!?1HA~bJ)n?;P|{Y^slk~Jz78Hc=$t~>Lg^ltXg?n= z{4<#5KF;l}ndW9jy1L}iV+~E%7%-R?Zq5PD-mw31afUOdPR>5Mx|{JRBW7J>kUy8jDxB`7q$W)yrKLJ6la=SU7w803u|-Xuul^#9Cl_ zmZPT3USCMsTB_o7Ki?Hz-Wr-rGI0n$7x_7^gcT8fn+dNd@P*IjIRIlufSd0M#)`FY zrWoX8tafm62kkT=jpeo6&&k9n;u(ZGe~eavu#iN=)(rkqqDs2n-Da9S(~H z$6?`37F@2F#gY{*5LnB@*IEe`qvt0*nSDj?rN7FdE=q zlIAJt1GYs3ppd1($ul9bA(y2QzY}o@r4eOW8V&dnu}GFi@FS3zEDe4qlkX^v$kx$l zaQd8>(y}z*M;@${rNQqU0{x>j!s}@?F4Q;?nSmd9nvvEH_z|cHp>c_f293sLlXF0p z2K;!$G?Asj?_6RnKxpJ{j7H<~1Vl`fr2#)Kkzkai!S6gG`G(SnY&eYu?=~kOr7R8j zafo>00NH0*aE6{(cV%h7k58m7WoaNEiTF?&>KiPcNI+yuWZMBh z9+9k;r4iu;?U$fo?chEC1k#j!7Wi?AbhIoDo(03;G}PBvz^{|>1(w*e_z}=emIk_s z39y6Gh!h8n1}DkNo6&x~KhVbKJ{vw3+67db-N8TkupGExu zY>Ka!LhvD6J`Rx=L-_GfTmt;a_i)kL2?avbuRuQX;0diAJWHg=5E_|-qS1u#Ehk7j z;Kw40d$e{ej)2(RAv7U2&w(ErOE}G4pSBNd*CO))-4tnW-!_ZmxZlSA{aQN9q{90 z>jLoWq!02C6K#wjf}!&q_`w&!V6w3B7{TSBv4lV+L=j)M58%heu_%|kq#@f5ASM`r z{wyFG5sKRhet3N0lIcl=ACK6&(`X_Ac@a&P2K-W$EVAG-Ds z{4hOOT(U}n@Z)2+NhBaISIM>met^!9epvto@G%k))kfK8S-_9T@XOL*W{HVBvMddB z6QX`V(1^M_t({1K(SV-_-Q&QsA{=AFSfcY+B!C5&-Usj_cl)${Spc+A+XD^5&m!1s zAnkx3nMtSfsHav@sC4g_N9q=Pg*C6}=Rnuu8 z3wcghwjIzoM7EzsgY6OOryw5}8#j0s!vZWG1Q>*$7-B5a2k?W%5org{VpsrZSlkdp zIt1wh_>sp$X?j4^#n(J2SR%G(iD6rd_%85cp=%zoy(CJ>NFRJGo&rB~Psf2<+E`oz ze)t{?U^`+fmY6R>V;%4lp)niegM|>24}b(h6GJTt@l)UjD+tmKRth|Z@vyZUc4eLH zf5FVC9>hik??Z&yKn$4CpLwkNbiH-M-)zFWg++x^$}Sb@atr~gi0-97s#apf~G$U zKmhkER%bC5AS*II2!5y!5&Y0TKt2J!zVV5d7tr(oevnY4(|}(mxf>7#(F6Lx)<%LK z>XX0^01Ukkc(#-E65s(M3mknFpldDgBk#Q<;{iz{tPe4|9ufRdzXE!^?>9xP7`DJ1$IXmmWR7_80I3} z3XL0puCO@>mtgU^4^SSnDQrVAeZ}O-5V{_a9>RPGpgcC_P$t3b0x2!LUoncMAd--` z$Y}jSe8Kz_vhCR1f+&RT{WwsMLgj-XhT?HZV-nviOdmH6hdd=jmjxy;I+h&RBcgVJ zRRN8sEDnc{%M7pHKy42@Q*?jHf=Ud!#siJK5lWYj3)N3l4=7+_eRQ%0z`}*iH&6o` zUr70)_!R7i*NQj*l`)%kvM=L+J7e{7 z`VidpC*OM}YZqt-i8HicSoV=P33vPderZs?pLQnVN*ge3~gE5n%yybqB8 zi#bqbLgN*r5AYf;_!YL+!s!EyA5=rJ`3Bi`Y|PYY(K{ zFw6y4DRAB3A_6+6`LOO|{lf7VtQ|~qB(_5;t+Qvz`$w|=Or*^)oC9eoH0D5-6|dLw zMF5--+e7XK!@vSA5Ycu3C{dYVX~g^wwq;mt7EU8!xf_67sQ-a)@UXofq{A@(6LeBb z058S%6~vN<`Wi$v{LBP6FJ>1W@m*&0SPUM7tx*CYUI!yig(5hD1z`ir^$9>>ydAzb zfM+pW2k;7w&&1geyd9Jwu(5=&i;bli-xEUw!(tAc-@y8Sd?JczSVAxz67M0Y0>BQj zDZm_TuEKU2^Jl2m;`{*eBVz<959~}4aZ(LidjOwe=glChVX=fr*I_b4nhVnn>dr_z zNZnv-1-!BXJF7vYcsiL2u(3dGh1Z_oAQ+sGK-p4AY22{12%MA ztPc?!-#}~+XCa_!i1mS=J%YUkido^@10L%{kTOSYAmZYCKM`ORtR0X1DnMH7gyk2T z3nDm)j?M)*IfIQkj2h!Vi%qZ-La`aN!{#)^ zPCQp2g2Ep*9zsYopz^_F#oKW)3<6avYz=^v5jLj*p<`<|q}$OxU@nk%;bg}MPNZV_ zSZGJSe^Is_3%nGsy%Pr-P~F6E8VsSqv)H);F&D3=z>LBC6plY*xPVoH96GRAd`#jA)rQ&;SDhyVZr(Z=!5zJ9Nou!2r6Uf zSd!2idlrtqVSRLxi-hzah8e^nEIvbF2Tn`UZ3Q%Z-v}!=I_A)hi{%esw~FSeq2z$w zUw~)fL?+rVB-}AsAWUL34!#eCvPLKEAo+my0VQw*mq4ilqBhzN(vygfLz#qphnVb~ zfoJjj1}r@&<|nEj=>83!h2jp87g>|k78D$l!e9@pkaGrco7wL77S?QYaD61LDmt)KF|z1KM6GKydKct zBT?r9m|X-D5*LF`5^Jbp}7v0p)HiZwpCUbZ-hSgy9^(-f&?CcCoUO2W$?*nEpe)gOP z1A^F;D5s$N88AHgx=&e|VTj=76Viteav6wE0$L;A6-a*;1Vq+10@b1G0%R<)yDdZ{ zLHBAv!_F5IG&BzaG#cje^>%RcaQ2qh)s<&1atm@MFPt*X;0-wN8`zKdVgn;j7cck= eG$r5Y3SZa_FU%qDrvhGpxFJ7o+$ 7$ and $5 < 7$. To multiply by a power of two the following functio int mp_mul_2d(mp_int * a, int b, mp_int * c); \end{alltt} -This will multiply ``a'' by $2^b$ and store the result in ``c''. If the value of $b$ is less than or equal to -zero the function will copy ``a'' to ``c'' without performing any further actions. +This will multiply $a$ by $2^b$ and store the result in ``c''. If the value of $b$ is less than or equal to +zero the function will copy $a$ to ``c'' without performing any further actions. To divide by a power of two use the following. @@ -892,8 +956,8 @@ To divide by a power of two use the following. \begin{alltt} int mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d); \end{alltt} -Which will divide ``a'' by $2^b$, store the quotient in ``c'' and the remainder in ``d'. If $b \le 0$ then the -function simply copies ``a'' over to ``c'' and zeroes ``d''. The variable ``d'' may be passed as a \textbf{NULL} +Which will divide $a$ by $2^b$, store the quotient in ``c'' and the remainder in ``d'. If $b \le 0$ then the +function simply copies $a$ over to ``c'' and zeroes $d$. The variable $d$ may be passed as a \textbf{NULL} value to signal that the remainder is not desired. \subsection{Polynomial Basis Operations} @@ -911,14 +975,14 @@ following function provides this operation. int mp_lshd (mp_int * a, int b); \end{alltt} -This will multiply ``a'' in place by $x^b$ which is equivalent to shifting the digits left $b$ places and inserting zeroes +This will multiply $a$ in place by $x^b$ which is equivalent to shifting the digits left $b$ places and inserting zeroes in the least significant digits. Similarly to divide by a power of $x$ the following function is provided. \index{mp\_rshd} \begin{alltt} void mp_rshd (mp_int * a, int b) \end{alltt} -This will divide ``a'' in place by $x^b$ and discard the remainder. This function cannot fail as it performs the operations +This will divide $a$ in place by $x^b$ and discard the remainder. This function cannot fail as it performs the operations in place and no new digits are required to complete it. \subsection{AND, OR and XOR Operations} @@ -948,7 +1012,6 @@ int mp_sub (mp_int * a, mp_int * b, mp_int * c) Which perform $c = a \odot b$ where $\odot$ is one of signed addition or subtraction. The operations are fully sign aware. - \section{Sign Manipulation} \subsection{Negation} \label{sec:NEG} @@ -959,7 +1022,7 @@ Simple integer negation can be performed with the following. int mp_neg (mp_int * a, mp_int * b); \end{alltt} -Which assigns $-b$ to $a$. +Which assigns $-a$ to $b$. \subsection{Absolute} Simple integer absolutes can be performed with the following. @@ -969,7 +1032,20 @@ Simple integer absolutes can be performed with the following. int mp_abs (mp_int * a, mp_int * b); \end{alltt} -Which assigns $\vert b \vert$ to $a$. +Which assigns $\vert a \vert$ to $b$. + +\section{Integer Division and Remainder} +To perform a complete and general integer division with remainder use the following function. + +\index{mp\_div} +\begin{alltt} +int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d); +\end{alltt} + +This divides $a$ by $b$ and stores the quotient in $c$ and $d$. The signed quotient is computed such that +$bc + d = a$. Note that either of $c$ or $d$ can be set to \textbf{NULL} if their value is not required. If +$b$ is zero the function returns \textbf{MP\_VAL}. + \chapter{Multiplication and Squaring} \section{Multiplication} @@ -986,6 +1062,57 @@ sized inputs. Then followed by the Comba and baseline multipliers. Fortunately for the developer you don't really need to know this unless you really want to fine tune the system. mp\_mul() will determine on its own\footnote{Some tweaking may be required.} what routine to use automatically when it is called. +\begin{alltt} +int main(void) +\{ + mp_int number1, number2; + int result; + + /* Initialize the numbers */ + if ((result = mp_init_multi(&number1, + &number2, NULL)) != MP_OKAY) \{ + printf("Error initializing the numbers. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* set the terms */ + if ((result = mp_set_int(&number, 257)) != MP_OKAY) \{ + printf("Error setting number1. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + if ((result = mp_set_int(&number2, 1023)) != MP_OKAY) \{ + printf("Error setting number2. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* multiply them */ + if ((result = mp_mul(&number1, &number2, + &number1)) != MP_OKAY) \{ + printf("Error multiplying terms. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* display */ + printf("number1 * number2 == \%lu", mp_get_int(&number1)); + + /* free terms and return */ + mp_clear_multi(&number1, &number2, NULL); + + return EXIT_SUCCESS; +\} +\end{alltt} + +If this program succeeds it shall output the following. + +\begin{alltt} +number1 * number2 == 262911 +\end{alltt} + \section{Squaring} Since squaring can be performed faster than multiplication it is performed it's own function instead of just using mp\_mul(). @@ -995,12 +1122,12 @@ mp\_mul(). int mp_sqr (mp_int * a, mp_int * b); \end{alltt} -Will square ``a'' and store it in ``b''. Like the case of multiplication there are four different squaring -algorithms all which can be called from mp\_sqr(). +Will square $a$ and store it in $b$. Like the case of multiplication there are four different squaring +algorithms all which can be called from mp\_sqr(). It is ideal to use mp\_sqr over mp\_mul when squaring terms. \section{Tuning Polynomial Basis Routines} -Both Toom-Cook and Karatsuba multiplication algorithms are faster than the traditional $O(n^2)$ approach that +Both of the Toom-Cook and Karatsuba multiplication algorithms are faster than the traditional $O(n^2)$ approach that the Comba and baseline algorithms use. At $O(n^{1.464973})$ and $O(n^{1.584962})$ running times respectfully they require considerably less work. For example, a 10000-digit multiplication would take roughly 724,000 single precision multiplications with Toom-Cook or 100,000,000 single precision multiplications with the standard Comba (a factor @@ -1044,30 +1171,286 @@ good Karatsuba squaring and multiplication points. Then it proceeds to find Too tuning takes a very long time as the cutoff points are likely to be very high. \chapter{Modular Reduction} -\section{Integer Division and Remainder} -To perform a complete and general integer division with remainder use the following function. -\index{mp\_div} +Modular reduction is process of taking the remainder of one quantity divided by another. Expressed +as (\ref{eqn:mod}) the modular reduction is equivalent to the remainder of $b$ divided by $c$. + +\begin{equation} +a \equiv b \mbox{ (mod }c\mbox{)} +\label{eqn:mod} +\end{equation} + +Of particular interest to cryptography are reductions where $b$ is limited to the range $0 \le b < c^2$ since particularly +fast reduction algorithms can be written for the limited range. + +Note that one of the four optimized reduction algorithms are automatically chosen in the modular exponentiation +algorithm mp\_exptmod when an appropriate modulus is detected. + +\section{Straight Division} +In order to effect an arbitrary modular reduction the following algorithm is provided. + +\index{mp\_mod} \begin{alltt} -int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d); +int mp_mod(mp_int *a, mp_int *b, mp_int *c); \end{alltt} -This divides ``a'' by ``b'' and stores the quotient in ``c'' and ``d''. The signed quotient is computed such that -$bc + d = a$. Note that either of ``c'' or ``d'' can be set to \textbf{NULL} if their value is not required. +This reduces $a$ modulo $b$ and stores the result in $c$. The sign of $c$ shall agree with the sign +of $b$. This algorithm accepts an input $a$ of any range and is not limited by $0 \le a < b^2$. \section{Barrett Reduction} + +Barrett reduction is a generic optimized reduction algorithm that requires pre--computation to achieve +a decent speedup over straight division. First a $mu$ value must be precomputed with the following function. + +\index{mp\_reduce\_setup} +\begin{alltt} +int mp_reduce_setup(mp_int *a, mp_int *b); +\end{alltt} + +Given a modulus in $b$ this produces the required $mu$ value in $a$. For any given modulus this only has to +be computed once. Modular reduction can now be performed with the following. + +\index{mp\_reduce} +\begin{alltt} +int mp_reduce(mp_int *a, mp_int *b, mp_int *c); +\end{alltt} + +This will reduce $a$ in place modulo $b$ with the precomputed $mu$ value in $c$. $a$ must be in the range +$0 \le a < b^2$. + +\begin{alltt} +int main(void) +\{ + mp_int a, b, c, mu; + int result; + + /* initialize a,b to desired values, mp_init mu, + * c and set c to 1...we want to compute a^3 mod b + */ + + /* get mu value */ + if ((result = mp_reduce_setup(&mu, b)) != MP_OKAY) \{ + printf("Error getting mu. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* square a to get c = a^2 */ + if ((result = mp_sqr(&a, &c)) != MP_OKAY) \{ + printf("Error squaring. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* now reduce `c' modulo b */ + if ((result = mp_reduce(&c, &b, &mu)) != MP_OKAY) \{ + printf("Error reducing. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* multiply a to get c = a^3 */ + if ((result = mp_mul(&a, &c, &c)) != MP_OKAY) \{ + printf("Error reducing. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* now reduce `c' modulo b */ + if ((result = mp_reduce(&c, &b, &mu)) != MP_OKAY) \{ + printf("Error reducing. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* c now equals a^3 mod b */ + + return EXIT_SUCCESS; +\} +\end{alltt} + +This program will calculate $a^3 \mbox{ mod }b$ if all the functions succeed. + \section{Montgomery Reduction} + +Montgomery is a specialized reduction algorithm for any odd moduli. Like Barrett reduction a pre--computation +step is required. This is accomplished with the following. + +\index{mp\_montgomery\_setup} +\begin{alltt} +int mp_montgomery_setup(mp_int *a, mp_digit *mp); +\end{alltt} + +For the given odd moduli $a$ the precomputation value is placed in $mp$. The reduction is computed with the +following. + +\index{mp\_montgomery\_reduce} +\begin{alltt} +int mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp); +\end{alltt} +This reduces $a$ in place modulo $m$ with the pre--computed value $mp$. $a$ must be in the range +$0 \le a < b^2$. + +Montgomery reduction is faster than Barrett reduction for moduli smaller than the ``comba'' limit. With the default +setup for instance, the limit is $127$ digits ($3556$--bits). Note that this function is not limited to +$127$ digits just that it falls back to a baseline algorithm after that point. + +An important observation is that this reduction does not return $a \mbox{ mod }m$ but $aR^{-1} \mbox{ mod }m$ +where $R = \beta^n$, $n$ is the n number of digits in $m$ and $\beta$ is radix used (default is $2^{28}$). + +To quickly calculate $R$ the following function was provided. + +\index{mp\_montgomery\_calc\_normalization} +\begin{alltt} +int mp_montgomery_calc_normalization(mp_int *a, mp_int *b); +\end{alltt} +Which calculates $a = R$ for the odd moduli $b$ without using multiplication or division. + +The normal modus operandi for Montgomery reductions is to normalize the integers before entering the system. For +example, to calculate $a^3 \mbox { mod }b$ using Montgomery reduction the value of $a$ can be normalized by +multiplying it by $R$. Consider the following code snippet. + +\begin{alltt} +int main(void) +\{ + mp_int a, b, c, R; + mp_digit mp; + int result; + + /* initialize a,b to desired values, + * mp_init R, c and set c to 1.... + */ + + /* get normalization */ + if ((result = mp_montgomery_calc_normalization(&R, b)) != MP_OKAY) \{ + printf("Error getting norm. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* get mp value */ + if ((result = mp_montgomery_setup(&c, &mp)) != MP_OKAY) \{ + printf("Error setting up montgomery. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* normalize `a' so now a is equal to aR */ + if ((result = mp_mulmod(&a, &R, &b, &a)) != MP_OKAY) \{ + printf("Error computing aR. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* square a to get c = a^2R^2 */ + if ((result = mp_sqr(&a, &c)) != MP_OKAY) \{ + printf("Error squaring. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* now reduce `c' back down to c = a^2R^2 * R^-1 == a^2R */ + if ((result = mp_montgomery_reduce(&c, &b, mp)) != MP_OKAY) \{ + printf("Error reducing. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* multiply a to get c = a^3R^2 */ + if ((result = mp_mul(&a, &c, &c)) != MP_OKAY) \{ + printf("Error reducing. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* now reduce `c' back down to c = a^3R^2 * R^-1 == a^3R */ + if ((result = mp_montgomery_reduce(&c, &b, mp)) != MP_OKAY) \{ + printf("Error reducing. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* now reduce (again) `c' back down to c = a^3R * R^-1 == a^3 */ + if ((result = mp_montgomery_reduce(&c, &b, mp)) != MP_OKAY) \{ + printf("Error reducing. \%s", + mp_error_to_string(result)); + return EXIT_FAILURE; + \} + + /* c now equals a^3 mod b */ + + return EXIT_SUCCESS; +\} +\end{alltt} + +This particular example does not look too efficient but it demonstrates the point of the algorithm. By +normalizing the inputs the reduced results are always of the form $aR$ for some variable $a$. This allows +a single final reduction to correct for the normalization and the fast reduction used within the algorithm. + +For more details consider examining the file \textit{bn\_mp\_exptmod\_fast.c}. + \section{Restricted Dimminished Radix} + +``Dimminished Radix'' reduction refers to reduction with respect to moduli that are ameniable to simple +digit shifting and small multiplications. In this case the ``restricted'' variant refers to moduli of the +form $\beta^k - p$ for some $k \ge 0$ and $0 < p < \beta$ where $\beta$ is the radix (default to $2^{28}$). + +As in the case of Montgomery reduction there is a pre--computation phase required for a given modulus. + +\index{mp\_dr\_setup} +\begin{alltt} +void mp_dr_setup(mp_int *a, mp_digit *d); +\end{alltt} + +This computes the value required for the modulus $a$ and stores it in $d$. This function cannot fail +and does not return any error codes. After the pre--computation a reduction can be performed with the +following. + +\index{mp\_dr\_reduce} +\begin{alltt} +int mp_dr_reduce(mp_int *a, mp_int *b, mp_digit mp); +\end{alltt} + +This reduces $a$ in place modulo $b$ with the pre--computed value $mp$. $b$ must be of a restricted +dimminished radix form and $a$ must be in the range $0 \le a < b^2$. Dimminished radix reductions are +much faster than both Barrett and Montgomery reductions as they have a much lower asymtotic running time. + +Since the moduli are restricted this algorithm is not particularly useful for something like Rabin, RSA or +BBS cryptographic purposes. This reduction algorithm is useful for Diffie-Hellman and ECC where fixed +primes are acceptable. + +Note that unlike Montgomery reduction there is no normalization process. The result of this function is +equal to the correct residue. + \section{Unrestricted Dimminshed Radix} +Unrestricted reductions work much like the restricted counterparts except in this case the moduli is of the +form $2^k - p$ for $0 < p < \beta$. In this sense the unrestricted reductions are more flexible as they +can be applied to a wider range of numbers. + +\index{mp\_reduce\_2k\_setup} +\begin{alltt} +int mp_reduce_2k_setup(mp_int *a, mp_digit *d); +\end{alltt} + +This will compute the required $d$ value for the given moduli $a$. + +\index{mp\_reduce\_2k} +\begin{alltt} +int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d); +\end{alltt} + +This will reduce $a$ in place modulo $n$ with the pre--computed value $d$. From my experience this routine is +slower than mp\_dr\_reduce but faster for most moduli sizes than the Montgomery reduction. + \chapter{Exponentiation} \section{Single Digit Exponentiation} \index{mp\_expt\_d} \begin{alltt} int mp_expt_d (mp_int * a, mp_digit b, mp_int * c) \end{alltt} -This computes $c = a^b$ using a simple binary left-to-write algorithm. It is faster than repeated multiplications for -all values of $b$ greater than three. +This computes $c = a^b$ using a simple binary left-to-right algorithm. It is faster than repeated multiplications by +$a$ for all values of $b$ greater than three. \section{Modular Exponentiation} \index{mp\_exptmod} @@ -1077,7 +1460,12 @@ int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) This computes $Y \equiv G^X \mbox{ (mod }P\mbox{)}$ using a variable width sliding window algorithm. This function will automatically detect the fastest modular reduction technique to use during the operation. For negative values of $X$ the operation is performed as $Y \equiv (G^{-1} \mbox{ mod }P)^{\vert X \vert} \mbox{ (mod }P\mbox{)}$ provided that -$gcd(G, P) = 1$. +$gcd(G, P) = 1$. + +This function is actually a shell around the two internal exponentiation functions. This routine will automatically +detect when Barrett, Montgomery, Restricted and Unrestricted Dimminished Radix based exponentiation can be used. Generally +moduli of the a ``restricted dimminished radix'' form lead to the fastest modular exponentiations. Followed by Montgomery +and the other two algorithms. \section{Root Finding} \index{mp\_n\_root} @@ -1090,6 +1478,11 @@ numbers (less than 1000 bits) I'd avoid $b > 3$ situations. Will return a posit a root with the sign of the input for odd roots. For example, performing $4^{1/2}$ will return $2$ whereas $(-8)^{1/3}$ will return $-2$. +This algorithm uses the ``Newton Approximation'' method and will converge on the correct root fairly quickly. Since +the algorithm requires raising $a$ to the power of $b$ it is not ideal to attempt to find roots for large +values of $b$. If particularly large roots are required then a factor method could be used instead. For example, +$a^{1/16}$ is equivalent to $\left (a^{1/4} \right)^{1/4}$. + \chapter{Prime Numbers} \section{Trial Division} \index{mp\_prime\_is\_divisible} @@ -1168,10 +1561,44 @@ typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat); \end{alltt} Which is a function that must read $len$ bytes (and return the amount stored) into $dst$. The $dat$ variable is simply -copied from the original input. It can be used to pass RNG context data to the callback. +copied from the original input. It can be used to pass RNG context data to the callback. The function +mp\_prime\_random() is more suitable for generating primes which must be secret (as in the case of RSA) since there +is no skew on the least significant bits. -The function mp\_prime\_random() is more suitable for generating primes which must be secret (as in the case of RSA) since -there is no skew on the least significant bits. +\textit{Note:} As of v0.30 of the LibTomMath library this function has been deprecated. It is still available +but users are encouraged to use the new mp\_prime\_random\_ex() function instead. + +\subsection{Extended Generation} +\index{mp\_prime\_random\_ex} +\begin{alltt} +int mp_prime_random_ex(mp_int *a, int t, + int size, int flags, + ltm_prime_callback cb, void *dat); +\end{alltt} +This will generate a prime in $a$ using $t$ tests of the primality testing algorithms. The variable $size$ +specifies the bit length of the prime desired. The variable $flags$ specifies one of several options available +(see fig. \ref{fig:primeopts}) which can be OR'ed together. The callback parameters are used as in +mp\_prime\_random(). + +\begin{figure}[here] +\begin{center} +\begin{small} +\begin{tabular}{|r|l|} +\hline \textbf{Flag} & \textbf{Meaning} \\ +\hline LTM\_PRIME\_BBS & Make the prime congruent to $3$ modulo $4$ \\ +\hline LTM\_PRIME\_SAFE & Make a prime $p$ such that $(p - 1)/2$ is also prime. \\ + & This option implies LTM\_PRIME\_BBS as well. \\ +\hline LTM\_PRIME\_2MSB\_OFF & Makes sure that the bit adjacent to the most significant bit \\ + & Is forced to zero. \\ +\hline LTM\_PRIME\_2MSB\_ON & Makes sure that the bit adjacent to the most significant bit \\ + & Is forced to one. \\ +\hline +\end{tabular} +\end{small} +\end{center} +\caption{Primality Generation Options} +\label{fig:primeopts} +\end{figure} \chapter{Input and Output} \section{ASCII Conversions} @@ -1180,7 +1607,7 @@ there is no skew on the least significant bits. \begin{alltt} int mp_toradix (mp_int * a, char *str, int radix); \end{alltt} -This still store ``a'' in ``str'' as a base-``radix'' string of ASCII chars. This function appends a NUL character +This still store $a$ in ``str'' as a base-``radix'' string of ASCII chars. This function appends a NUL character to terminate the string. Valid values of ``radix'' line in the range $[2, 64]$. To determine the size (exact) required by the conversion before storing any data use the following function. @@ -1196,12 +1623,46 @@ function returns an error code and ``size'' will be zero. \begin{alltt} int mp_read_radix (mp_int * a, char *str, int radix); \end{alltt} -This will read the base-``radix'' NUL terminated string from ``str'' into ``a''. It will stop reading when it reads a +This will read the base-``radix'' NUL terminated string from ``str'' into $a$. It will stop reading when it reads a character it does not recognize (which happens to include th NUL char... imagine that...). A single leading $-$ sign can be used to denote a negative number. \section{Binary Conversions} -\section{Stream Functions} + +Converting an mp\_int to and from binary is another keen idea. + +\index{mp\_unsigned\_bin\_size} +\begin{alltt} +int mp_unsigned_bin_size(mp_int *a); +\end{alltt} + +This will return the number of bytes (octets) required to store the unsigned copy of the integer $a$. + +\index{mp\_to\_unsigned\_bin} +\begin{alltt} +int mp_to_unsigned_bin(mp_int *a, unsigned char *b); +\end{alltt} +This will store $a$ into the buffer $b$ in big--endian format. Fortunately this is exactly what DER (or is it ASN?) +requires. It does not store the sign of the integer. + +\index{mp\_read\_unsigned\_bin} +\begin{alltt} +int mp_read_unsigned_bin(mp_int *a, unsigned char *b, int c); +\end{alltt} +This will read in an unsigned big--endian array of bytes (octets) from $b$ of length $c$ into $a$. The resulting +integer $a$ will always be positive. + +For those who acknowledge the existence of negative numbers (heretic!) there are ``signed'' versions of the +previous functions. + +\begin{alltt} +int mp_signed_bin_size(mp_int *a); +int mp_read_signed_bin(mp_int *a, unsigned char *b, int c); +int mp_to_signed_bin(mp_int *a, unsigned char *b); +\end{alltt} +They operate essentially the same as the unsigned copies except they prefix the data with zero or non--zero +byte depending on the sign. If the sign is zpos (e.g. not negative) the prefix is zero, otherwise the prefix +is non--zero. \chapter{Algebraic Functions} \section{Extended Euclidean Algorithm} @@ -1217,6 +1678,8 @@ This finds the triple U1/U2/U3 using the Extended Euclidean algorithm such that a \cdot U1 + b \cdot U2 = U3 \end{equation} +Any of the U1/U2/U3 paramters can be set to \textbf{NULL} if they are not desired. + \section{Greatest Common Divisor} \index{mp\_gcd} \begin{alltt} @@ -1248,10 +1711,23 @@ int mp_invmod (mp_int * a, mp_int * b, mp_int * c) \end{alltt} Computes the multiplicative inverse of $a$ modulo $b$ and stores the result in $c$ such that $ac \equiv 1 \mbox{ (mod }b\mbox{)}$. - - \section{Single Digit Functions} +For those using small numbers (\textit{snicker snicker}) there are several ``helper'' functions + +\index{mp\_add\_d} \index{mp\_sub\_d} \index{mp\_mul\_d} \index{mp\_div\_d} \index{mp\_mod\_d} +\begin{alltt} +int mp_add_d(mp_int *a, mp_digit b, mp_int *c); +int mp_sub_d(mp_int *a, mp_digit b, mp_int *c); +int mp_mul_d(mp_int *a, mp_digit b, mp_int *c); +int mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d); +int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c); +\end{alltt} + +These work like the full mp\_int capable variants except the second parameter $b$ is a mp\_digit. These +functions fairly handy if you have to work with relatively small numbers since you will not have to allocate +an entire mp\_int to store a number like $1$ or $2$. + \input{bn.ind} \end{document} diff --git a/bn_fast_s_mp_sqr.c b/bn_fast_s_mp_sqr.c index d5b9787..f62ae54 100644 --- a/bn_fast_s_mp_sqr.c +++ b/bn_fast_s_mp_sqr.c @@ -31,8 +31,7 @@ * Based on Algorithm 14.16 on pp.597 of HAC. * */ -int -fast_s_mp_sqr (mp_int * a, mp_int * b) +int fast_s_mp_sqr (mp_int * a, mp_int * b) { int olduse, newused, res, ix, pa; mp_word W2[MP_WARRAY], W[MP_WARRAY]; diff --git a/bn_mp_cnt_lsb.c b/bn_mp_cnt_lsb.c index e46161b..07cb709 100644 --- a/bn_mp_cnt_lsb.c +++ b/bn_mp_cnt_lsb.c @@ -14,11 +14,15 @@ */ #include +static const int lnz[16] = { + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 +}; + /* Counts the number of lsbs which are zero before the first zero bit */ int mp_cnt_lsb(mp_int *a) { int x; - mp_digit q; + mp_digit q, qq; /* easy out */ if (mp_iszero(a) == 1) { @@ -31,11 +35,13 @@ int mp_cnt_lsb(mp_int *a) x *= DIGIT_BIT; /* now scan this digit until a 1 is found */ - while ((q & 1) == 0) { - q >>= 1; - x += 1; + if ((q & 1) == 0) { + do { + qq = q & 15; + x += lnz[qq]; + q >>= 4; + } while (qq == 0); } - return x; } diff --git a/bn_mp_exteuclid.c b/bn_mp_exteuclid.c index 6875f72..cb3f787 100644 --- a/bn_mp_exteuclid.c +++ b/bn_mp_exteuclid.c @@ -1,69 +1,69 @@ -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is a library that provides multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library was designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* Extended euclidean algorithm of (a, b) produces - a*u1 + b*u2 = u3 - */ -int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3) -{ - mp_int u1,u2,u3,v1,v2,v3,t1,t2,t3,q,tmp; - int err; - - if ((err = mp_init_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL)) != MP_OKAY) { - return err; - } - - /* initialize, (u1,u2,u3) = (1,0,a) */ - mp_set(&u1, 1); - if ((err = mp_copy(a, &u3)) != MP_OKAY) { goto _ERR; } - - /* initialize, (v1,v2,v3) = (0,1,b) */ - mp_set(&v2, 1); - if ((err = mp_copy(b, &v3)) != MP_OKAY) { goto _ERR; } - - /* loop while v3 != 0 */ - while (mp_iszero(&v3) == MP_NO) { - /* q = u3/v3 */ - if ((err = mp_div(&u3, &v3, &q, NULL)) != MP_OKAY) { goto _ERR; } - - /* (t1,t2,t3) = (u1,u2,u3) - (v1,v2,v3)q */ - if ((err = mp_mul(&v1, &q, &tmp)) != MP_OKAY) { goto _ERR; } - if ((err = mp_sub(&u1, &tmp, &t1)) != MP_OKAY) { goto _ERR; } - if ((err = mp_mul(&v2, &q, &tmp)) != MP_OKAY) { goto _ERR; } - if ((err = mp_sub(&u2, &tmp, &t2)) != MP_OKAY) { goto _ERR; } - if ((err = mp_mul(&v3, &q, &tmp)) != MP_OKAY) { goto _ERR; } - if ((err = mp_sub(&u3, &tmp, &t3)) != MP_OKAY) { goto _ERR; } - - /* (u1,u2,u3) = (v1,v2,v3) */ - if ((err = mp_copy(&v1, &u1)) != MP_OKAY) { goto _ERR; } - if ((err = mp_copy(&v2, &u2)) != MP_OKAY) { goto _ERR; } - if ((err = mp_copy(&v3, &u3)) != MP_OKAY) { goto _ERR; } - - /* (v1,v2,v3) = (t1,t2,t3) */ - if ((err = mp_copy(&t1, &v1)) != MP_OKAY) { goto _ERR; } - if ((err = mp_copy(&t2, &v2)) != MP_OKAY) { goto _ERR; } - if ((err = mp_copy(&t3, &v3)) != MP_OKAY) { goto _ERR; } - } - - /* copy result out */ - if (U1 != NULL) { mp_exch(U1, &u1); } - if (U2 != NULL) { mp_exch(U2, &u2); } - if (U3 != NULL) { mp_exch(U3, &u3); } - - err = MP_OKAY; -_ERR: mp_clear_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL); - return err; -} +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Extended euclidean algorithm of (a, b) produces + a*u1 + b*u2 = u3 + */ +int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3) +{ + mp_int u1,u2,u3,v1,v2,v3,t1,t2,t3,q,tmp; + int err; + + if ((err = mp_init_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL)) != MP_OKAY) { + return err; + } + + /* initialize, (u1,u2,u3) = (1,0,a) */ + mp_set(&u1, 1); + if ((err = mp_copy(a, &u3)) != MP_OKAY) { goto _ERR; } + + /* initialize, (v1,v2,v3) = (0,1,b) */ + mp_set(&v2, 1); + if ((err = mp_copy(b, &v3)) != MP_OKAY) { goto _ERR; } + + /* loop while v3 != 0 */ + while (mp_iszero(&v3) == MP_NO) { + /* q = u3/v3 */ + if ((err = mp_div(&u3, &v3, &q, NULL)) != MP_OKAY) { goto _ERR; } + + /* (t1,t2,t3) = (u1,u2,u3) - (v1,v2,v3)q */ + if ((err = mp_mul(&v1, &q, &tmp)) != MP_OKAY) { goto _ERR; } + if ((err = mp_sub(&u1, &tmp, &t1)) != MP_OKAY) { goto _ERR; } + if ((err = mp_mul(&v2, &q, &tmp)) != MP_OKAY) { goto _ERR; } + if ((err = mp_sub(&u2, &tmp, &t2)) != MP_OKAY) { goto _ERR; } + if ((err = mp_mul(&v3, &q, &tmp)) != MP_OKAY) { goto _ERR; } + if ((err = mp_sub(&u3, &tmp, &t3)) != MP_OKAY) { goto _ERR; } + + /* (u1,u2,u3) = (v1,v2,v3) */ + if ((err = mp_copy(&v1, &u1)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&v2, &u2)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&v3, &u3)) != MP_OKAY) { goto _ERR; } + + /* (v1,v2,v3) = (t1,t2,t3) */ + if ((err = mp_copy(&t1, &v1)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&t2, &v2)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&t3, &v3)) != MP_OKAY) { goto _ERR; } + } + + /* copy result out */ + if (U1 != NULL) { mp_exch(U1, &u1); } + if (U2 != NULL) { mp_exch(U2, &u2); } + if (U3 != NULL) { mp_exch(U3, &u3); } + + err = MP_OKAY; +_ERR: mp_clear_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL); + return err; +} diff --git a/bn_mp_fwrite.c b/bn_mp_fwrite.c index 61acfc3..2853ec1 100644 --- a/bn_mp_fwrite.c +++ b/bn_mp_fwrite.c @@ -23,7 +23,7 @@ int mp_fwrite(mp_int *a, int radix, FILE *stream) return err; } - buf = XMALLOC (len); + buf = OPT_CAST(char) XMALLOC (len); if (buf == NULL) { return MP_MEM; } diff --git a/bn_mp_get_int.c b/bn_mp_get_int.c new file mode 100644 index 0000000..41df6e1 --- /dev/null +++ b/bn_mp_get_int.c @@ -0,0 +1,39 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* get the lower 32-bits of an mp_int */ +unsigned long mp_get_int(mp_int * a) +{ + int i; + unsigned long res; + + if (a->used == 0) { + return 0; + } + + /* get number of digits of the lsb we have to read */ + i = MIN(a->used,(int)((sizeof(unsigned long)*CHAR_BIT+DIGIT_BIT-1)/DIGIT_BIT))-1; + + /* get most significant digit of result */ + res = DIGIT(a,i); + + while (--i >= 0) { + res = (res << DIGIT_BIT) | DIGIT(a,i); + } + + /* force result to 32-bits always so it is consistent on non 32-bit platforms */ + return res & 0xFFFFFFFFUL; +} diff --git a/bn_mp_grow.c b/bn_mp_grow.c index 157ac3f..43a3028 100644 --- a/bn_mp_grow.c +++ b/bn_mp_grow.c @@ -31,7 +31,7 @@ int mp_grow (mp_int * a, int size) * in case the operation failed we don't want * to overwrite the dp member of a. */ - tmp = OPT_CAST XREALLOC (a->dp, sizeof (mp_digit) * size); + tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * size); if (tmp == NULL) { /* reallocation failed but "a" is still valid [can be freed] */ return MP_MEM; diff --git a/bn_mp_init.c b/bn_mp_init.c index 993ce64..5c5c1ad 100644 --- a/bn_mp_init.c +++ b/bn_mp_init.c @@ -18,7 +18,7 @@ int mp_init (mp_int * a) { /* allocate memory required and clear it */ - a->dp = OPT_CAST XCALLOC (sizeof (mp_digit), MP_PREC); + a->dp = OPT_CAST(mp_digit) XCALLOC (sizeof (mp_digit), MP_PREC); if (a->dp == NULL) { return MP_MEM; } diff --git a/bn_mp_init_set.c b/bn_mp_init_set.c new file mode 100644 index 0000000..c8d8bf8 --- /dev/null +++ b/bn_mp_init_set.c @@ -0,0 +1,26 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* initialize and set a digit */ +int mp_init_set (mp_int * a, mp_digit b) +{ + int err; + if ((err = mp_init(a)) != MP_OKAY) { + return err; + } + mp_set(a, b); + return err; +} diff --git a/bn_mp_init_set_int.c b/bn_mp_init_set_int.c new file mode 100644 index 0000000..2d6628d --- /dev/null +++ b/bn_mp_init_set_int.c @@ -0,0 +1,25 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* initialize and set a digit */ +int mp_init_set_int (mp_int * a, unsigned long b) +{ + int err; + if ((err = mp_init(a)) != MP_OKAY) { + return err; + } + return mp_set_int(a, b); +} diff --git a/bn_mp_init_size.c b/bn_mp_init_size.c index be27d07..c763ee0 100644 --- a/bn_mp_init_size.c +++ b/bn_mp_init_size.c @@ -21,7 +21,7 @@ int mp_init_size (mp_int * a, int size) size += (MP_PREC * 2) - (size % MP_PREC); /* alloc mem */ - a->dp = OPT_CAST XCALLOC (sizeof (mp_digit), size); + a->dp = OPT_CAST(mp_digit) XCALLOC (sizeof (mp_digit), size); if (a->dp == NULL) { return MP_MEM; } diff --git a/bn_mp_is_square.c b/bn_mp_is_square.c new file mode 100644 index 0000000..1f01bca --- /dev/null +++ b/bn_mp_is_square.c @@ -0,0 +1,103 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Check if remainders are possible squares - fast exclude non-squares */ +static const char rem_128[128] = { + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 +}; + +static const char rem_105[105] = { + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 +}; + +/* Store non-zero to ret if arg is square, and zero if not */ +int mp_is_square(mp_int *arg,int *ret) +{ + int res; + mp_digit c; + mp_int t; + unsigned long r; + + /* Default to Non-square :) */ + *ret = MP_NO; + + if (arg->sign == MP_NEG) { + return MP_VAL; + } + + /* digits used? (TSD) */ + if (arg->used == 0) { + return MP_OKAY; + } + + /* First check mod 128 (suppose that DIGIT_BIT is at least 7) */ + if (rem_128[127 & DIGIT(arg,0)] == 1) { + return MP_OKAY; + } + + /* Next check mod 105 (3*5*7) */ + if ((res = mp_mod_d(arg,105,&c)) != MP_OKAY) { + return res; + } + if (rem_105[c] == 1) { + return MP_OKAY; + } + + /* product of primes less than 2^31 */ + if ((res = mp_init_set_int(&t,11L*13L*17L*19L*23L*29L*31L)) != MP_OKAY) { + return res; + } + if ((res = mp_mod(arg,&t,&t)) != MP_OKAY) { + goto ERR; + } + r = mp_get_int(&t); + /* Check for other prime modules, note it's not an ERROR but we must + * free "t" so the easiest way is to goto ERR. We know that res + * is already equal to MP_OKAY from the mp_mod call + */ + if ( (1L<<(r%11)) & 0x5C4L ) goto ERR; + if ( (1L<<(r%13)) & 0x9E4L ) goto ERR; + if ( (1L<<(r%17)) & 0x5CE8L ) goto ERR; + if ( (1L<<(r%19)) & 0x4F50CL ) goto ERR; + if ( (1L<<(r%23)) & 0x7ACCA0L ) goto ERR; + if ( (1L<<(r%29)) & 0xC2EDD0CL ) goto ERR; + if ( (1L<<(r%31)) & 0x6DE2B848L ) goto ERR; + + /* Final check - is sqr(sqrt(arg)) == arg ? */ + if ((res = mp_sqrt(arg,&t)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sqr(&t,&t)) != MP_OKAY) { + goto ERR; + } + + *ret = (mp_cmp_mag(&t,arg) == MP_EQ) ? MP_YES : MP_NO; +ERR:mp_clear(&t); + return res; +} diff --git a/bn_mp_karatsuba_mul.c b/bn_mp_karatsuba_mul.c index 95353ea..169dacf 100644 --- a/bn_mp_karatsuba_mul.c +++ b/bn_mp_karatsuba_mul.c @@ -43,8 +43,7 @@ * Generally though the overhead of this method doesn't pay off * until a certain size (N ~ 80) is reached. */ -int -mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) +int mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) { mp_int x0, x1, y0, y1, t1, x0y0, x1y1; int B, err; @@ -56,7 +55,7 @@ mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) B = MIN (a->used, b->used); /* now divide in two */ - B = B / 2; + B = B >> 1; /* init copy all the temps */ if (mp_init_size (&x0, B) != MP_OKAY) diff --git a/bn_mp_karatsuba_sqr.c b/bn_mp_karatsuba_sqr.c index 04dd286..c335613 100644 --- a/bn_mp_karatsuba_sqr.c +++ b/bn_mp_karatsuba_sqr.c @@ -21,8 +21,7 @@ * is essentially the same algorithm but merely * tuned to perform recursive squarings. */ -int -mp_karatsuba_sqr (mp_int * a, mp_int * b) +int mp_karatsuba_sqr (mp_int * a, mp_int * b) { mp_int x0, x1, t1, t2, x0x0, x1x1; int B, err; @@ -33,7 +32,7 @@ mp_karatsuba_sqr (mp_int * a, mp_int * b) B = a->used; /* now divide in two */ - B = B / 2; + B = B >> 1; /* init copy all the temps */ if (mp_init_size (&x0, B) != MP_OKAY) diff --git a/bn_mp_mod.c b/bn_mp_mod.c index d5ebb16..ad963a9 100644 --- a/bn_mp_mod.c +++ b/bn_mp_mod.c @@ -21,7 +21,6 @@ mp_mod (mp_int * a, mp_int * b, mp_int * c) mp_int t; int res; - if ((res = mp_init (&t)) != MP_OKAY) { return res; } @@ -31,7 +30,7 @@ mp_mod (mp_int * a, mp_int * b, mp_int * c) return res; } - if (t.sign == MP_NEG) { + if (t.sign != b->sign) { res = mp_add (b, &t, c); } else { res = MP_OKAY; diff --git a/bn_mp_n_root.c b/bn_mp_n_root.c index 755468b..a79af17 100644 --- a/bn_mp_n_root.c +++ b/bn_mp_n_root.c @@ -101,7 +101,7 @@ int mp_n_root (mp_int * a, mp_digit b, mp_int * c) if (mp_cmp (&t2, a) == MP_GT) { if ((res = mp_sub_d (&t1, 1, &t1)) != MP_OKAY) { - goto __T3; + goto __T3; } } else { break; diff --git a/bn_mp_neg.c b/bn_mp_neg.c index debdbd8..f9de6e4 100644 --- a/bn_mp_neg.c +++ b/bn_mp_neg.c @@ -21,7 +21,7 @@ int mp_neg (mp_int * a, mp_int * b) if ((res = mp_copy (a, b)) != MP_OKAY) { return res; } - if (mp_iszero(b) != 1) { + if (mp_iszero(b) != MP_YES) { b->sign = (a->sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; } return MP_OKAY; diff --git a/bn_mp_prime_random.c b/bn_mp_prime_random.c deleted file mode 100644 index c28859b..0000000 --- a/bn_mp_prime_random.c +++ /dev/null @@ -1,74 +0,0 @@ -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is a library that provides multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library was designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* makes a truly random prime of a given size (bytes), - * call with bbs = 1 if you want it to be congruent to 3 mod 4 - * - * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can - * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself - * so it can be NULL - * - * The prime generated will be larger than 2^(8*size). - */ - -/* this sole function may hold the key to enslaving all mankind! */ -int mp_prime_random(mp_int *a, int t, int size, int bbs, ltm_prime_callback cb, void *dat) -{ - unsigned char *tmp; - int res, err; - - /* sanity check the input */ - if (size <= 0) { - return MP_VAL; - } - - /* we need a buffer of size+1 bytes */ - tmp = XMALLOC(size+1); - if (tmp == NULL) { - return MP_MEM; - } - - /* fix MSB */ - tmp[0] = 1; - - do { - /* read the bytes */ - if (cb(tmp+1, size, dat) != size) { - err = MP_VAL; - goto error; - } - - /* fix the LSB */ - tmp[size] |= (bbs ? 3 : 1); - - /* read it in */ - if ((err = mp_read_unsigned_bin(a, tmp, size+1)) != MP_OKAY) { - goto error; - } - - /* is it prime? */ - if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { - goto error; - } - } while (res == MP_NO); - - err = MP_OKAY; -error: - XFREE(tmp); - return err; -} - - diff --git a/bn_mp_prime_random_ex.c b/bn_mp_prime_random_ex.c new file mode 100644 index 0000000..147721b --- /dev/null +++ b/bn_mp_prime_random_ex.c @@ -0,0 +1,118 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* makes a truly random prime of a given size (bits), + * + * Flags are as follows: + * + * LTM_PRIME_BBS - make prime congruent to 3 mod 4 + * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) + * LTM_PRIME_2MSB_OFF - make the 2nd highest bit zero + * LTM_PRIME_2MSB_ON - make the 2nd highest bit one + * + * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can + * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself + * so it can be NULL + * + */ + +/* This is possibly the mother of all prime generation functions, muahahahahaha! */ +int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat) +{ + unsigned char *tmp, maskAND, maskOR_msb, maskOR_lsb; + int res, err, bsize, maskOR_msb_offset; + + /* sanity check the input */ + if (size <= 1 || t <= 0) { + return MP_VAL; + } + + /* LTM_PRIME_SAFE implies LTM_PRIME_BBS */ + if (flags & LTM_PRIME_SAFE) { + flags |= LTM_PRIME_BBS; + } + + /* calc the byte size */ + bsize = (size>>3)+(size&7?1:0); + + /* we need a buffer of bsize bytes */ + tmp = OPT_CAST(unsigned char) XMALLOC(bsize); + if (tmp == NULL) { + return MP_MEM; + } + + /* calc the maskAND value for the MSbyte*/ + maskAND = 0xFF >> (8 - (size & 7)); + + /* calc the maskOR_msb */ + maskOR_msb = 0; + maskOR_msb_offset = (size - 2) >> 3; + if (flags & LTM_PRIME_2MSB_ON) { + maskOR_msb |= 1 << ((size - 2) & 7); + } else if (flags & LTM_PRIME_2MSB_OFF) { + maskAND &= ~(1 << ((size - 2) & 7)); + } + + /* get the maskOR_lsb */ + maskOR_lsb = 0; + if (flags & LTM_PRIME_BBS) { + maskOR_lsb |= 3; + } + + do { + /* read the bytes */ + if (cb(tmp, bsize, dat) != bsize) { + err = MP_VAL; + goto error; + } + + /* work over the MSbyte */ + tmp[0] &= maskAND; + tmp[0] |= 1 << ((size - 1) & 7); + + /* mix in the maskORs */ + tmp[maskOR_msb_offset] |= maskOR_msb; + tmp[bsize-1] |= maskOR_lsb; + + /* read it in */ + if ((err = mp_read_unsigned_bin(a, tmp, bsize)) != MP_OKAY) { goto error; } + + /* is it prime? */ + if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } + + if (flags & LTM_PRIME_SAFE) { + /* see if (a-1)/2 is prime */ + if ((err = mp_sub_d(a, 1, a)) != MP_OKAY) { goto error; } + if ((err = mp_div_2(a, a)) != MP_OKAY) { goto error; } + + /* is it prime? */ + if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } + } + } while (res == MP_NO); + + if (flags & LTM_PRIME_SAFE) { + /* restore a to the original value */ + if ((err = mp_mul_2(a, a)) != MP_OKAY) { goto error; } + if ((err = mp_add_d(a, 1, a)) != MP_OKAY) { goto error; } + } + + err = MP_OKAY; +error: + XFREE(tmp); + return err; +} + + diff --git a/bn_mp_reduce_2k.c b/bn_mp_reduce_2k.c index f73d3b9..f6b40cf 100644 --- a/bn_mp_reduce_2k.c +++ b/bn_mp_reduce_2k.c @@ -14,9 +14,9 @@ */ #include -/* reduces a modulo n where n is of the form 2**p - k */ +/* reduces a modulo n where n is of the form 2**p - d */ int -mp_reduce_2k(mp_int *a, mp_int *n, mp_digit k) +mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d) { mp_int q; int p, res; @@ -32,9 +32,9 @@ top: goto ERR; } - if (k != 1) { - /* q = q * k */ - if ((res = mp_mul_d(&q, k, &q)) != MP_OKAY) { + if (d != 1) { + /* q = q * d */ + if ((res = mp_mul_d(&q, d, &q)) != MP_OKAY) { goto ERR; } } diff --git a/bn_mp_shrink.c b/bn_mp_shrink.c index a419b6e..daefed2 100644 --- a/bn_mp_shrink.c +++ b/bn_mp_shrink.c @@ -19,7 +19,7 @@ int mp_shrink (mp_int * a) { mp_digit *tmp; if (a->alloc != a->used && a->used > 0) { - if ((tmp = OPT_CAST XREALLOC (a->dp, sizeof (mp_digit) * a->used)) == NULL) { + if ((tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * a->used)) == NULL) { return MP_MEM; } a->dp = tmp; diff --git a/bn_mp_sqrt.c b/bn_mp_sqrt.c new file mode 100644 index 0000000..ec9d102 --- /dev/null +++ b/bn_mp_sqrt.c @@ -0,0 +1,75 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* this function is less generic than mp_n_root, simpler and faster */ +int mp_sqrt(mp_int *arg, mp_int *ret) +{ + int res; + mp_int t1,t2; + + /* must be positive */ + if (arg->sign == MP_NEG) { + return MP_VAL; + } + + /* easy out */ + if (mp_iszero(arg) == MP_YES) { + mp_zero(ret); + return MP_OKAY; + } + + if ((res = mp_init_copy(&t1, arg)) != MP_OKAY) { + return res; + } + + if ((res = mp_init(&t2)) != MP_OKAY) { + goto E2; + } + + /* First approx. (not very bad for large arg) */ + mp_rshd (&t1,t1.used/2); + + /* t1 > 0 */ + if ((res = mp_div(arg,&t1,&t2,NULL)) != MP_OKAY) { + goto E1; + } + if ((res = mp_add(&t1,&t2,&t1)) != MP_OKAY) { + goto E1; + } + if ((res = mp_div_2(&t1,&t1)) != MP_OKAY) { + goto E1; + } + /* And now t1 > sqrt(arg) */ + do { + if ((res = mp_div(arg,&t1,&t2,NULL)) != MP_OKAY) { + goto E1; + } + if ((res = mp_add(&t1,&t2,&t1)) != MP_OKAY) { + goto E1; + } + if ((res = mp_div_2(&t1,&t1)) != MP_OKAY) { + goto E1; + } + /* t1 >= sqrt(arg) >= t2 at this point */ + } while (mp_cmp_mag(&t1,&t2) == MP_GT); + + mp_exch(&t1,ret); + +E1: mp_clear(&t2); +E2: mp_clear(&t1); + return res; +} + diff --git a/bn_mp_toom_mul.c b/bn_mp_toom_mul.c index 2ba4624..50660ff 100644 --- a/bn_mp_toom_mul.c +++ b/bn_mp_toom_mul.c @@ -15,8 +15,7 @@ #include /* multiplication using the Toom-Cook 3-way algorithm */ -int -mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) +int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) { mp_int w0, w1, w2, w3, w4, tmp1, tmp2, a0, a1, a2, b0, b1, b2; int res, B; diff --git a/bn_mp_toradix_n.c b/bn_mp_toradix_n.c new file mode 100644 index 0000000..d2f6ec2 --- /dev/null +++ b/bn_mp_toradix_n.c @@ -0,0 +1,83 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* stores a bignum as a ASCII string in a given radix (2..64) + * + * Stores upto maxlen-1 chars and always a NULL byte + */ +int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen) +{ + int res, digs; + mp_int t; + mp_digit d; + char *_s = str; + + /* check range of the maxlen, radix */ + if (maxlen < 3 || radix < 2 || radix > 64) { + return MP_VAL; + } + + /* quick out if its zero */ + if (mp_iszero(a) == 1) { + *str++ = '0'; + *str = '\0'; + return MP_OKAY; + } + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + /* if it is negative output a - */ + if (t.sign == MP_NEG) { + /* we have to reverse our digits later... but not the - sign!! */ + ++_s; + + /* store the flag and mark the number as positive */ + *str++ = '-'; + t.sign = MP_ZPOS; + + /* subtract a char */ + --maxlen; + } + + digs = 0; + while (mp_iszero (&t) == 0) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return res; + } + *str++ = mp_s_rmap[d]; + ++digs; + + if (--maxlen == 1) { + /* no more room */ + break; + } + } + + /* reverse the digits of the string. In this case _s points + * to the first digit [exluding the sign] of the number] + */ + bn_reverse ((unsigned char *)_s, digs); + + /* append a NULL so the string is properly terminated */ + *str = '\0'; + + mp_clear (&t); + return MP_OKAY; +} + diff --git a/bn_s_mp_sqr.c b/bn_s_mp_sqr.c index b282470..3a00a4e 100644 --- a/bn_s_mp_sqr.c +++ b/bn_s_mp_sqr.c @@ -26,8 +26,8 @@ s_mp_sqr (mp_int * a, mp_int * b) pa = a->used; if ((res = mp_init_size (&t, 2*pa + 1)) != MP_OKAY) { return res; - } - + } + /* default used is maximum possible size */ t.used = 2*pa + 1; diff --git a/changes.txt b/changes.txt index 3998eb8..63e9d61 100644 --- a/changes.txt +++ b/changes.txt @@ -1,13 +1,32 @@ +April 11th, 2004 +v0.30 -- Added "mp_toradix_n" which stores upto "n-1" least significant digits of an mp_int + -- Johan Lindh sent a patch so MSVC wouldn't whine about redefining malloc [in weird dll modes] + -- Henrik Goldman spotted a missing OPT_CAST in mp_fwrite() + -- Tuned tommath.h so that when MP_LOW_MEM is defined MP_PREC shall be reduced. + [I also allow MP_PREC to be externally defined now] + -- Sped up mp_cnt_lsb() by using a 4x4 table [e.g. 4x speedup] + -- Added mp_prime_random_ex() which is a more versatile prime generator accurate to + exact bit lengths (unlike the deprecated but still available mp_prime_random() which + is only accurate to byte lengths). See the new LTM_PRIME_* flags ;-) + -- Alex Polushin contributed an optimized mp_sqrt() as well as mp_get_int() and mp_is_square(). + I've cleaned them all up to be a little more consistent [along with one bug fix] for this release. + -- Added mp_init_set and mp_init_set_int to initialize and set small constants with one function + call. + -- Removed /etclib directory [um LibTomPoly deprecates this]. + -- Fixed mp_mod() so the sign of the result agrees with the sign of the modulus. + ++ N.B. My semester is almost up so expect updates to the textbook to be posted to the libtomcrypt.org + website. + Jan 25th, 2004 v0.29 ++ Note: "Henrik" from the v0.28 changelog refers to Henrik Goldman ;-) -- Added fix to mp_shrink to prevent a realloc when used == 0 [e.g. realloc zero bytes???] - -- Made the mp_prime_rabin_miller_trials() function internal table smaller and also + -- Made the mp_prime_rabin_miller_trials() function internal table smaller and also set the minimum number of tests to two (sounds a bit safer). -- Added a mp_exteuclid() which computes the extended euclidean algorithm. -- Fixed a memory leak in s_mp_exptmod() [called when Barrett reduction is to be used] which would arise - if a multiplication or subsequent reduction failed [would not free the temp result]. - -- Made an API change to mp_radix_size(). It now returns an error code and stores the required size - through an "int star" passed to it. + if a multiplication or subsequent reduction failed [would not free the temp result]. + -- Made an API change to mp_radix_size(). It now returns an error code and stores the required size + through an "int star" passed to it. Dec 24th, 2003 v0.28 -- Henrik Goldman suggested I add casts to the montomgery code [stores into mu...] so compilers wouldn't @@ -18,17 +37,17 @@ v0.28 -- Henrik Goldman suggested I add casts to the montomgery code [stores in (idea from chat with Niels Ferguson at Crypto'03) -- Picked up a second wind. I'm filled with Gooo. Mission Gooo! -- Removed divisions from mp_reduce_is_2k() - -- Sped up mp_div_d() [general case] to use only one division per digit instead of two. + -- Sped up mp_div_d() [general case] to use only one division per digit instead of two. -- Added the heap macros from LTC to LTM. Now you can easily [by editing four lines of tommath.h] change the name of the heap functions used in LTM [also compatible with LTC via MPI mode] -- Added bn_prime_rabin_miller_trials() which gives the number of Rabin-Miller trials to achieve a failure rate of less than 2^-96 -- fixed bug in fast_mp_invmod(). The initial testing logic was wrong. An invalid input is not when - "a" and "b" are even it's when "b" is even [the algo is for odd moduli only]. + "a" and "b" are even it's when "b" is even [the algo is for odd moduli only]. -- Started a new manual [finally]. It is incomplete and will be finished as time goes on. I had to stop - adding full demos around half way in chapter three so I could at least get a good portion of the + adding full demos around half way in chapter three so I could at least get a good portion of the manual done. If you really need help using the library you can always email me! - -- My Textbook is now included as part of the package [all Public Domain] + -- My Textbook is now included as part of the package [all Public Domain] Sept 19th, 2003 v0.27 -- Removed changes.txt~ which was made by accident since "kate" decided it was @@ -41,7 +60,7 @@ v0.27 -- Removed changes.txt~ which was made by accident since "kate" decided i Aug 29th, 2003 v0.26 -- Fixed typo that caused warning with GCC 3.2 - -- Martin Marcel noticed a bug in mp_neg() that allowed negative zeroes. + -- Martin Marcel noticed a bug in mp_neg() that allowed negative zeroes. Also, Martin is the fellow who noted the bugs in mp_gcd() of 0.24/0.25. -- Martin Marcel noticed an optimization [and slight bug] in mp_lcm(). -- Added fix to mp_read_unsigned_bin to prevent a buffer overflow. @@ -102,18 +121,18 @@ v0.22 -- Fixed up mp_invmod so the result is properly in range now [was always June 19th, 2003 v0.21 -- Fixed bug in mp_mul_d which would not handle sign correctly [would not always forward it] - -- Removed the #line lines from gen.pl [was in violation of ISO C] + -- Removed the #line lines from gen.pl [was in violation of ISO C] June 8th, 2003 -v0.20 -- Removed the book from the package. Added the TDCAL license document. +v0.20 -- Removed the book from the package. Added the TDCAL license document. -- This release is officially pure-bred TDCAL again [last officially TDCAL based release was v0.16] June 6th, 2003 v0.19 -- Fixed a bug in mp_montgomery_reduce() which was introduced when I tweaked mp_rshd() in the previous release. Essentially the digits were not trimmed before the compare which cause a subtraction to occur all the time. - -- Fixed up etc/tune.c a bit to stop testing new cutoffs after 16 failures [to find more optimal points]. + -- Fixed up etc/tune.c a bit to stop testing new cutoffs after 16 failures [to find more optimal points]. Brute force ho! - + May 29th, 2003 v0.18 -- Fixed a bug in s_mp_sqr which would handle carries properly just not very elegantly. @@ -121,7 +140,7 @@ v0.18 -- Fixed a bug in s_mp_sqr which would handle carries properly just not v -- Fixed bug in mp_sqr which still had a 512 constant instead of MP_WARRAY -- Added Toom-Cook multipliers [needs tuning!] -- Added efficient divide by 3 algorithm mp_div_3 - -- Re-wrote mp_div_d to be faster than calling mp_div + -- Re-wrote mp_div_d to be faster than calling mp_div -- Added in a donated BCC makefile and a single page LTM poster (ahalhabsi@sbcglobal.net) -- Added mp_reduce_2k which reduces an input modulo n = 2**p - k for any single digit k -- Made the exptmod system be aware of the 2k reduction algorithms. @@ -134,13 +153,13 @@ v0.17 -- Benjamin Goldberg submitted optimized mp_add and mp_sub routines. A n -- Fixed bug in mp_exptmod that would cause it to fail for odd moduli when DIGIT_BIT != 28 -- mp_exptmod now also returns errors if the modulus is negative and will handle negative exponents -- mp_prime_is_prime will now return true if the input is one of the primes in the prime table - -- Damian M Gryski (dgryski@uwaterloo.ca) found a index out of bounds error in the - mp_fast_s_mp_mul_high_digs function which didn't come up before. (fixed) + -- Damian M Gryski (dgryski@uwaterloo.ca) found a index out of bounds error in the + mp_fast_s_mp_mul_high_digs function which didn't come up before. (fixed) -- Refactored the DR reduction code so there is only one function per file. -- Fixed bug in the mp_mul() which would erroneously avoid the faster multiplier [comba] when it was allowed. The bug would not cause the incorrect value to be produced just less efficient (fixed) -- Fixed similar bug in the Montgomery reduction code. - -- Added tons of (mp_digit) casts so the 7/15/28/31 bit digit code will work flawlessly out of the box. + -- Added tons of (mp_digit) casts so the 7/15/28/31 bit digit code will work flawlessly out of the box. Also added limited support for 64-bit machines with a 60-bit digit. Both thanks to Tom Wu (tom@arcot.com) -- Added new comments here and there, cleaned up some code [style stuff] -- Fixed a lingering typo in mp_exptmod* that would set bitcnt to zero then one. Very silly stuff :-) @@ -148,19 +167,19 @@ v0.17 -- Benjamin Goldberg submitted optimized mp_add and mp_sub routines. A n saves quite a few calls and if statements. -- Added etc/mont.c a test of the Montgomery reduction [assuming all else works :-| ] -- Fixed up etc/tune.c to use a wider test range [more appropriate] also added a x86 based addition which - uses RDTSC for high precision timing. - -- Updated demo/demo.c to remove MPI stuff [won't work anyways], made the tests run for 2 seconds each so its + uses RDTSC for high precision timing. + -- Updated demo/demo.c to remove MPI stuff [won't work anyways], made the tests run for 2 seconds each so its not so insanely slow. Also made the output space delimited [and fixed up various errors] - -- Added logs directory, logs/graph.dem which will use gnuplot to make a series of PNG files - that go with the pre-made index.html. You have to build [via make timing] and run ltmtest first in the + -- Added logs directory, logs/graph.dem which will use gnuplot to make a series of PNG files + that go with the pre-made index.html. You have to build [via make timing] and run ltmtest first in the root of the package. - -- Fixed a bug in mp_sub and mp_add where "-a - -a" or "-a + a" would produce -0 as the result [obviously invalid]. + -- Fixed a bug in mp_sub and mp_add where "-a - -a" or "-a + a" would produce -0 as the result [obviously invalid]. -- Fixed a bug in mp_rshd. If the count == a.used it should zero/return [instead of shifting] -- Fixed a "off-by-one" bug in mp_mul2d. The initial size check on alloc would be off by one if the residue - shifting caused a carry. + shifting caused a carry. -- Fixed a bug where s_mp_mul_digs() would not call the Comba based routine if allowed. This made Barrett reduction slower than it had to be. - + Mar 29th, 2003 v0.16 -- Sped up mp_div by making normalization one shift call -- Sped up mp_mul_2d/mp_div_2d by aliasing pointers :-) @@ -190,9 +209,9 @@ v0.14 -- Tons of manual updates also fixed up timing demo to use a finer granularity for various functions -- fixed up demo/demo.c testing to pause during testing so my Duron won't catch on fire [stays around 31-35C during testing :-)] - + Feb 13th, 2003 -v0.13 -- tons of minor speed-ups in low level add, sub, mul_2 and div_2 which propagate +v0.13 -- tons of minor speed-ups in low level add, sub, mul_2 and div_2 which propagate to other functions like mp_invmod, mp_div, etc... -- Sped up mp_exptmod_fast by using new code to find R mod m [e.g. B^n mod m] -- minor fixes @@ -212,12 +231,12 @@ v0.11 -- More subtle fixes -- Moved to gentoo linux [hurrah!] so made *nix specific fixes to the make process -- Sped up the montgomery reduction code quite a bit -- fixed up demo so when building timing for the x86 it assumes ELF format now - + Jan 9th, 2003 -v0.10 -- Pekka Riikonen suggested fixes to the radix conversion code. +v0.10 -- Pekka Riikonen suggested fixes to the radix conversion code. -- Added baseline montgomery and comba montgomery reductions, sped up exptmods [to a point, see bn.h for MONTGOMERY_EXPT_CUTOFF] - + Jan 6th, 2003 v0.09 -- Updated the manual to reflect recent changes. :-) -- Added Jacobi function (mp_jacobi) to supplement the number theory side of the lib @@ -230,16 +249,16 @@ v0.08 -- Sped up the multipliers by moving the inner loop variables into a smal -- Made "mtest" be able to use /dev/random, /dev/urandom or stdin for RNG data -- Corrected some bugs where error messages were potentially ignored -- add etc/pprime.c program which makes numbers which are provably prime. - + Jan 1st, 2003 v0.07 -- Removed alot of heap operations from core functions to speed them up -- Added a root finding function [and mp_sqrt macro like from MPI] - -- Added more to manual + -- Added more to manual Dec 31st, 2002 v0.06 -- Sped up the s_mp_add, s_mp_sub which inturn sped up mp_invmod, mp_exptmod, etc... -- Cleaned up the header a bit more - + Dec 30th, 2002 v0.05 -- Builds with MSVC out of the box -- Fixed a bug in mp_invmod w.r.t. even moduli @@ -247,19 +266,19 @@ v0.05 -- Builds with MSVC out of the box -- Fixed up exptmod to use fewer multiplications -- Fixed up mp_init_size to use only one heap operation -- Note there is a slight "off-by-one" bug in the library somewhere - without the padding (see the source for comment) the library + without the padding (see the source for comment) the library crashes in libtomcrypt. Anyways a reasonable workaround is to pad the numbers which will always correct it since as the numbers grow the padding will still be beyond the end of the number -- Added more to the manual - + Dec 29th, 2002 v0.04 -- Fixed a memory leak in mp_to_unsigned_bin -- optimized invmod code -- Fixed bug in mp_div -- use exchange instead of copy for results -- added a bit more to the manual - + Dec 27th, 2002 v0.03 -- Sped up s_mp_mul_high_digs by not computing the carries of the lower digits -- Fixed a bug where mp_set_int wouldn't zero the value first and set the used member. @@ -270,7 +289,7 @@ v0.03 -- Sped up s_mp_mul_high_digs by not computing the carries of the lower d -- Many many many many fixes -- Works in LibTomCrypt now :-) -- Added iterations to the timing demos... more accurate. - -- Tom needs a job. + -- Tom needs a job. Dec 26th, 2002 v0.02 -- Fixed a few "slips" in the manual. This is "LibTomMath" afterall :-) @@ -279,7 +298,7 @@ v0.02 -- Fixed a few "slips" in the manual. This is "LibTomMath" afterall :-) Dec 25th,2002 v0.01 -- Initial release. Gimme a break. - -- Todo list, + -- Todo list, add details to manual [e.g. algorithms] more comments in code example programs diff --git a/demo/demo.c b/demo/demo.c index 089b319..8014ea8 100644 --- a/demo/demo.c +++ b/demo/demo.c @@ -1,5 +1,7 @@ #include +#define TESTING + #ifdef IOWNANATHLON #include #define SLEEP sleep(4) @@ -11,8 +13,45 @@ #ifdef TIMER ulong64 _tt; -void reset(void) { _tt = clock(); } -ulong64 rdtsc(void) { return clock() - _tt; } + +#if defined(__i386__) || defined(_M_IX86) || defined(_M_AMD64) +/* RDTSC from Scott Duplichan */ +static ulong64 TIMFUNC (void) + { + #if defined __GNUC__ + #ifdef __i386__ + ulong64 a; + __asm__ __volatile__ ("rdtsc ":"=A" (a)); + return a; + #else /* gcc-IA64 version */ + unsigned long result; + __asm__ __volatile__("mov %0=ar.itc" : "=r"(result) :: "memory"); + while (__builtin_expect ((int) result == -1, 0)) + __asm__ __volatile__("mov %0=ar.itc" : "=r"(result) :: "memory"); + return result; + #endif + + // Microsoft and Intel Windows compilers + #elif defined _M_IX86 + __asm rdtsc + #elif defined _M_AMD64 + return __rdtsc (); + #elif defined _M_IA64 + #if defined __INTEL_COMPILER + #include + #endif + return __getReg (3116); + #else + #error need rdtsc function for this build + #endif + } +#else +#define TIMFUNC clock +#endif + +ulong64 rdtsc(void) { return TIMFUNC() - _tt; } +void reset(void) { _tt = TIMFUNC(); } + #endif void ndraw(mp_int *a, char *name) @@ -42,6 +81,13 @@ int lbit(void) } } +int myrng(unsigned char *dst, int len, void *dat) +{ + int x; + for (x = 0; x < len; x++) dst[x] = rand() & 0xFF; + return len; +} + #define DO2(x) x; x; #define DO4(x) DO2(x); DO2(x); @@ -53,13 +99,12 @@ int main(void) { mp_int a, b, c, d, e, f; unsigned long expt_n, add_n, sub_n, mul_n, div_n, sqr_n, mul2d_n, div2d_n, gcd_n, lcm_n, inv_n, - div2_n, mul2_n, add_d_n, sub_d_n; + div2_n, mul2_n, add_d_n, sub_d_n, t; unsigned rr; - int cnt, ix, old_kara_m, old_kara_s; + int i, n, err, cnt, ix, old_kara_m, old_kara_s; #ifdef TIMER - int n; - ulong64 tt; + ulong64 tt, CLK_PER_SEC; FILE *log, *logb, *logc; #endif @@ -72,6 +117,127 @@ int main(void) srand(time(NULL)); +#ifdef TESTING + // test mp_get_int + printf("Testing: mp_get_int\n"); + for(i=0;i<1000;++i) { + t = (unsigned long)rand()*rand()+1; + mp_set_int(&a,t); + if (t!=mp_get_int(&a)) { + printf("mp_get_int() bad result!\n"); + return 1; + } + } + mp_set_int(&a,0); + if (mp_get_int(&a)!=0) + { printf("mp_get_int() bad result!\n"); + return 1; + } + mp_set_int(&a,0xffffffff); + if (mp_get_int(&a)!=0xffffffff) + { printf("mp_get_int() bad result!\n"); + return 1; + } + + // test mp_sqrt + printf("Testing: mp_sqrt\n"); + for (i=0;i<10000;++i) { + printf("%6d\r", i); fflush(stdout); + n = (rand()&15)+1; + mp_rand(&a,n); + if (mp_sqrt(&a,&b) != MP_OKAY) + { printf("mp_sqrt() error!\n"); + return 1; + } + mp_n_root(&a,2,&a); + if (mp_cmp_mag(&b,&a) != MP_EQ) + { printf("mp_sqrt() bad result!\n"); + return 1; + } + } + + printf("\nTesting: mp_is_square\n"); + for (i=0;i<100000;++i) { + printf("%6d\r", i); fflush(stdout); + + /* test mp_is_square false negatives */ + n = (rand()&7)+1; + mp_rand(&a,n); + mp_sqr(&a,&a); + if (mp_is_square(&a,&n)!=MP_OKAY) { + printf("fn:mp_is_square() error!\n"); + return 1; + } + if (n==0) { + printf("fn:mp_is_square() bad result!\n"); + return 1; + } + + /* test for false positives */ + mp_add_d(&a, 1, &a); + if (mp_is_square(&a,&n)!=MP_OKAY) { + printf("fp:mp_is_square() error!\n"); + return 1; + } + if (n==1) { + printf("fp:mp_is_square() bad result!\n"); + return 1; + } + + } + printf("\n\n"); +#endif + +#ifdef TESTING + /* test for size */ + for (ix = 16; ix < 512; ix++) { + printf("Testing (not safe-prime): %9d bits \r", ix); fflush(stdout); + err = mp_prime_random_ex(&a, 8, ix, (rand()&1)?LTM_PRIME_2MSB_OFF:LTM_PRIME_2MSB_ON, myrng, NULL); + if (err != MP_OKAY) { + printf("failed with err code %d\n", err); + return EXIT_FAILURE; + } + if (mp_count_bits(&a) != ix) { + printf("Prime is %d not %d bits!!!\n", mp_count_bits(&a), ix); + return EXIT_FAILURE; + } + } + + for (ix = 16; ix < 512; ix++) { + printf("Testing ( safe-prime): %9d bits \r", ix); fflush(stdout); + err = mp_prime_random_ex(&a, 8, ix, ((rand()&1)?LTM_PRIME_2MSB_OFF:LTM_PRIME_2MSB_ON)|LTM_PRIME_SAFE, myrng, NULL); + if (err != MP_OKAY) { + printf("failed with err code %d\n", err); + return EXIT_FAILURE; + } + if (mp_count_bits(&a) != ix) { + printf("Prime is %d not %d bits!!!\n", mp_count_bits(&a), ix); + return EXIT_FAILURE; + } + /* let's see if it's really a safe prime */ + mp_sub_d(&a, 1, &a); + mp_div_2(&a, &a); + mp_prime_is_prime(&a, 8, &cnt); + if (cnt != MP_YES) { + printf("sub is not prime!\n"); + return EXIT_FAILURE; + } + } + + printf("\n\n"); +#endif + +#ifdef TESTING + mp_read_radix(&a, "123456", 10); + mp_toradix_n(&a, buf, 10, 3); + printf("a == %s\n", buf); + mp_toradix_n(&a, buf, 10, 4); + printf("a == %s\n", buf); + mp_toradix_n(&a, buf, 10, 30); + printf("a == %s\n", buf); +#endif + + #if 0 for (;;) { fgets(buf, sizeof(buf), stdin); @@ -97,12 +263,13 @@ int main(void) } #endif -#if 0 +#ifdef TESTING /* test mp_cnt_lsb */ + printf("testing mp_cnt_lsb...\n"); mp_set(&a, 1); - for (ix = 0; ix < 128; ix++) { + for (ix = 0; ix < 1024; ix++) { if (mp_cnt_lsb(&a) != ix) { - printf("Failed at %d\n", ix); + printf("Failed at %d, %d\n", ix, mp_cnt_lsb(&a)); return 0; } mp_mul_2(&a, &a); @@ -110,7 +277,8 @@ int main(void) #endif /* test mp_reduce_2k */ -#if 0 +#ifdef TESTING + printf("Testing mp_reduce_2k...\n"); for (cnt = 3; cnt <= 384; ++cnt) { mp_digit tmp; mp_2expt(&a, cnt); @@ -137,7 +305,8 @@ int main(void) /* test mp_div_3 */ -#if 0 +#ifdef TESTING + printf("Testing mp_div_3...\n"); mp_set(&d, 3); for (cnt = 0; cnt < 1000000; ) { mp_digit r1, r2; @@ -155,7 +324,8 @@ int main(void) #endif /* test the DR reduction */ -#if 0 +#ifdef TESTING + printf("testing mp_dr_reduce...\n"); for (cnt = 2; cnt < 128; cnt++) { printf("%d digit modulus\n", cnt); mp_grow(&a, cnt); @@ -190,7 +360,13 @@ int main(void) #ifdef TIMER /* temp. turn off TOOM */ TOOM_MUL_CUTOFF = TOOM_SQR_CUTOFF = 100000; - printf("CLOCKS_PER_SEC == %lu\n", CLOCKS_PER_SEC); + + reset(); + sleep(1); + CLK_PER_SEC = rdtsc(); + + printf("CLK_PER_SEC == %lu\n", CLK_PER_SEC); + log = fopen("logs/add.log", "w"); for (cnt = 8; cnt <= 128; cnt += 8) { @@ -202,10 +378,10 @@ int main(void) do { DO(mp_add(&a,&b,&c)); rr += 16; - } while (rdtsc() < (CLOCKS_PER_SEC * 2)); + } while (rdtsc() < (CLK_PER_SEC * 2)); tt = rdtsc(); - printf("Adding\t\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLOCKS_PER_SEC)/tt, tt); - fprintf(log, "%d %9llu\n", cnt*DIGIT_BIT, (((ulong64)rr)*CLOCKS_PER_SEC)/tt); + printf("Adding\t\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLK_PER_SEC)/tt, tt); + fprintf(log, "%d %9llu\n", cnt*DIGIT_BIT, (((ulong64)rr)*CLK_PER_SEC)/tt); fflush(log); } fclose(log); @@ -219,10 +395,10 @@ int main(void) do { DO(mp_sub(&a,&b,&c)); rr += 16; - } while (rdtsc() < (CLOCKS_PER_SEC * 2)); + } while (rdtsc() < (CLK_PER_SEC * 2)); tt = rdtsc(); - printf("Subtracting\t\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLOCKS_PER_SEC)/tt, tt); - fprintf(log, "%d %9llu\n", cnt*DIGIT_BIT, (((ulong64)rr)*CLOCKS_PER_SEC)/tt); + printf("Subtracting\t\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLK_PER_SEC)/tt, tt); + fprintf(log, "%d %9llu\n", cnt*DIGIT_BIT, (((ulong64)rr)*CLK_PER_SEC)/tt); fflush(log); } fclose(log); @@ -237,7 +413,7 @@ mult_test: KARATSUBA_SQR_CUTOFF = (ix==0)?9999:old_kara_s; log = fopen((ix==0)?"logs/mult.log":"logs/mult_kara.log", "w"); - for (cnt = 32; cnt <= 288; cnt += 16) { + for (cnt = 32; cnt <= 288; cnt += 8) { SLEEP; mp_rand(&a, cnt); mp_rand(&b, cnt); @@ -246,15 +422,15 @@ mult_test: do { DO(mp_mul(&a, &b, &c)); rr += 16; - } while (rdtsc() < (CLOCKS_PER_SEC * 2)); + } while (rdtsc() < (CLK_PER_SEC * 2)); tt = rdtsc(); - printf("Multiplying\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLOCKS_PER_SEC)/tt, tt); - fprintf(log, "%d %9llu\n", mp_count_bits(&a), (((ulong64)rr)*CLOCKS_PER_SEC)/tt); + printf("Multiplying\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLK_PER_SEC)/tt, tt); + fprintf(log, "%d %9llu\n", mp_count_bits(&a), (((ulong64)rr)*CLK_PER_SEC)/tt); fflush(log); } fclose(log); log = fopen((ix==0)?"logs/sqr.log":"logs/sqr_kara.log", "w"); - for (cnt = 32; cnt <= 288; cnt += 16) { + for (cnt = 32; cnt <= 288; cnt += 8) { SLEEP; mp_rand(&a, cnt); reset(); @@ -262,14 +438,15 @@ mult_test: do { DO(mp_sqr(&a, &b)); rr += 16; - } while (rdtsc() < (CLOCKS_PER_SEC * 2)); + } while (rdtsc() < (CLK_PER_SEC * 2)); tt = rdtsc(); - printf("Squaring\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLOCKS_PER_SEC)/tt, tt); - fprintf(log, "%d %9llu\n", mp_count_bits(&a), (((ulong64)rr)*CLOCKS_PER_SEC)/tt); + printf("Squaring\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLK_PER_SEC)/tt, tt); + fprintf(log, "%d %9llu\n", mp_count_bits(&a), (((ulong64)rr)*CLK_PER_SEC)/tt); fflush(log); } fclose(log); } +expt_test: { char *primes[] = { /* 2K moduli mersenne primes */ @@ -299,14 +476,12 @@ mult_test: "1214855636816562637502584060163403830270705000634713483015101384881871978446801224798536155406895823305035467591632531067547890948695117172076954220727075688048751022421198712032848890056357845974246560748347918630050853933697792254955890439720297560693579400297062396904306270145886830719309296352765295712183040773146419022875165382778007040109957609739589875590885701126197906063620133954893216612678838507540777138437797705602453719559017633986486649523611975865005712371194067612263330335590526176087004421363598470302731349138773205901447704682181517904064735636518462452242791676541725292378925568296858010151852326316777511935037531017413910506921922450666933202278489024521263798482237150056835746454842662048692127173834433089016107854491097456725016327709663199738238442164843147132789153725513257167915555162094970853584447993125488607696008169807374736711297007473812256272245489405898470297178738029484459690836250560495461579533254473316340608217876781986188705928270735695752830825527963838355419762516246028680280988020401914551825487349990306976304093109384451438813251211051597392127491464898797406789175453067960072008590614886532333015881171367104445044718144312416815712216611576221546455968770801413440778423979", NULL }; -expt_test: log = fopen("logs/expt.log", "w"); logb = fopen("logs/expt_dr.log", "w"); logc = fopen("logs/expt_2k.log", "w"); for (n = 0; primes[n]; n++) { SLEEP; mp_read_radix(&a, primes[n], 10); - printf("Different (%d)!!!\n", mp_count_bits(&a)); mp_zero(&b); for (rr = 0; rr < mp_count_bits(&a); rr++) { mp_mul_2(&b, &b); @@ -321,7 +496,7 @@ expt_test: do { DO(mp_exptmod(&c, &b, &a, &d)); rr += 16; - } while (rdtsc() < (CLOCKS_PER_SEC * 2)); + } while (rdtsc() < (CLK_PER_SEC * 2)); tt = rdtsc(); mp_sub_d(&a, 1, &e); mp_sub(&e, &b, &b); @@ -332,8 +507,8 @@ expt_test: draw(&d); exit(0); } - printf("Exponentiating\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLOCKS_PER_SEC)/tt, tt); - fprintf((n < 6) ? logc : (n < 13) ? logb : log, "%d %9llu\n", mp_count_bits(&a), (((ulong64)rr)*CLOCKS_PER_SEC)/tt); + printf("Exponentiating\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLK_PER_SEC)/tt, tt); + fprintf((n < 6) ? logc : (n < 13) ? logb : log, "%d %9llu\n", mp_count_bits(&a), (((ulong64)rr)*CLK_PER_SEC)/tt); } } fclose(log); @@ -356,15 +531,15 @@ expt_test: do { DO(mp_invmod(&b, &a, &c)); rr += 16; - } while (rdtsc() < (CLOCKS_PER_SEC * 2)); + } while (rdtsc() < (CLK_PER_SEC * 2)); tt = rdtsc(); mp_mulmod(&b, &c, &a, &d); if (mp_cmp_d(&d, 1) != MP_EQ) { printf("Failed to invert\n"); return 0; } - printf("Inverting mod\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLOCKS_PER_SEC)/tt, tt); - fprintf(log, "%d %9llu\n", cnt*DIGIT_BIT, (((ulong64)rr)*CLOCKS_PER_SEC)/tt); + printf("Inverting mod\t%4d-bit => %9llu/sec, %9llu ticks\n", mp_count_bits(&a), (((ulong64)rr)*CLK_PER_SEC)/tt, tt); + fprintf(log, "%d %9llu\n", cnt*DIGIT_BIT, (((ulong64)rr)*CLK_PER_SEC)/tt); } fclose(log); diff --git a/etc/mont.c b/etc/mont.c index 0de2084..dbf1735 100644 --- a/etc/mont.c +++ b/etc/mont.c @@ -1,46 +1,46 @@ -/* tests the montgomery routines */ -#include - -int main(void) -{ - mp_int modulus, R, p, pp; - mp_digit mp; - long x, y; - - srand(time(NULL)); - mp_init_multi(&modulus, &R, &p, &pp, NULL); - - /* loop through various sizes */ - for (x = 4; x < 256; x++) { - printf("DIGITS == %3ld...", x); fflush(stdout); - - /* make up the odd modulus */ - mp_rand(&modulus, x); - modulus.dp[0] |= 1; - - /* now find the R value */ - mp_montgomery_calc_normalization(&R, &modulus); - mp_montgomery_setup(&modulus, &mp); - - /* now run through a bunch tests */ - for (y = 0; y < 1000; y++) { - mp_rand(&p, x/2); /* p = random */ - mp_mul(&p, &R, &pp); /* pp = R * p */ - mp_montgomery_reduce(&pp, &modulus, mp); - - /* should be equal to p */ - if (mp_cmp(&pp, &p) != MP_EQ) { - printf("FAILURE!\n"); - exit(-1); - } - } - printf("PASSED\n"); - } - - return 0; -} - - - - - +/* tests the montgomery routines */ +#include + +int main(void) +{ + mp_int modulus, R, p, pp; + mp_digit mp; + long x, y; + + srand(time(NULL)); + mp_init_multi(&modulus, &R, &p, &pp, NULL); + + /* loop through various sizes */ + for (x = 4; x < 256; x++) { + printf("DIGITS == %3ld...", x); fflush(stdout); + + /* make up the odd modulus */ + mp_rand(&modulus, x); + modulus.dp[0] |= 1; + + /* now find the R value */ + mp_montgomery_calc_normalization(&R, &modulus); + mp_montgomery_setup(&modulus, &mp); + + /* now run through a bunch tests */ + for (y = 0; y < 1000; y++) { + mp_rand(&p, x/2); /* p = random */ + mp_mul(&p, &R, &pp); /* pp = R * p */ + mp_montgomery_reduce(&pp, &modulus, mp); + + /* should be equal to p */ + if (mp_cmp(&pp, &p) != MP_EQ) { + printf("FAILURE!\n"); + exit(-1); + } + } + printf("PASSED\n"); + } + + return 0; +} + + + + + diff --git a/etclib/poly.c b/etclib/poly.c deleted file mode 100644 index 0c85897..0000000 --- a/etclib/poly.c +++ /dev/null @@ -1,302 +0,0 @@ -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * This file "poly.c" provides GF(p^k) functionality on top of the - * libtommath library. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://libtommath.iahu.ca - */ -#include "poly.h" - -#undef MIN -#define MIN(x,y) ((x)<(y)?(x):(y)) -#undef MAX -#define MAX(x,y) ((x)>(y)?(x):(y)) - -static void s_free(mp_poly *a) -{ - int k; - for (k = 0; k < a->alloc; k++) { - mp_clear(&(a->co[k])); - } -} - -static int s_setup(mp_poly *a, int low, int high) -{ - int res, k, j; - for (k = low; k < high; k++) { - if ((res = mp_init(&(a->co[k]))) != MP_OKAY) { - for (j = low; j < k; j++) { - mp_clear(&(a->co[j])); - } - return MP_MEM; - } - } - return MP_OKAY; -} - -int mp_poly_init(mp_poly *a, mp_int *cha) -{ - return mp_poly_init_size(a, cha, MP_POLY_PREC); -} - -/* init a poly of a given (size) degree */ -int mp_poly_init_size(mp_poly *a, mp_int *cha, int size) -{ - int res; - - /* allocate array of mp_ints for coefficients */ - a->co = malloc(size * sizeof(mp_int)); - if (a->co == NULL) { - return MP_MEM; - } - a->used = 0; - a->alloc = size; - - /* now init the range */ - if ((res = s_setup(a, 0, size)) != MP_OKAY) { - free(a->co); - return res; - } - - /* copy characteristic */ - if ((res = mp_init_copy(&(a->cha), cha)) != MP_OKAY) { - s_free(a); - free(a->co); - return res; - } - - /* return ok at this point */ - return MP_OKAY; -} - -/* grow the size of a poly */ -static int mp_poly_grow(mp_poly *a, int size) -{ - int res; - - if (size > a->alloc) { - /* resize the array of coefficients */ - a->co = realloc(a->co, sizeof(mp_int) * size); - if (a->co == NULL) { - return MP_MEM; - } - - /* now setup the coefficients */ - if ((res = s_setup(a, a->alloc, a->alloc + size)) != MP_OKAY) { - return res; - } - - a->alloc += size; - } - return MP_OKAY; -} - -/* copy, b = a */ -int mp_poly_copy(mp_poly *a, mp_poly *b) -{ - int res, k; - - /* resize b */ - if ((res = mp_poly_grow(b, a->used)) != MP_OKAY) { - return res; - } - - /* now copy the used part */ - b->used = a->used; - - /* now the cha */ - if ((res = mp_copy(&(a->cha), &(b->cha))) != MP_OKAY) { - return res; - } - - /* now all the coefficients */ - for (k = 0; k < b->used; k++) { - if ((res = mp_copy(&(a->co[k]), &(b->co[k]))) != MP_OKAY) { - return res; - } - } - - /* now zero the top */ - for (k = b->used; k < b->alloc; k++) { - mp_zero(&(b->co[k])); - } - - return MP_OKAY; -} - -/* init from a copy, a = b */ -int mp_poly_init_copy(mp_poly *a, mp_poly *b) -{ - int res; - - if ((res = mp_poly_init(a, &(b->cha))) != MP_OKAY) { - return res; - } - return mp_poly_copy(b, a); -} - -/* free a poly from ram */ -void mp_poly_clear(mp_poly *a) -{ - s_free(a); - mp_clear(&(a->cha)); - free(a->co); - - a->co = NULL; - a->used = a->alloc = 0; -} - -/* exchange two polys */ -void mp_poly_exch(mp_poly *a, mp_poly *b) -{ - mp_poly t; - t = *a; *a = *b; *b = t; -} - -/* clamp the # of used digits */ -static void mp_poly_clamp(mp_poly *a) -{ - while (a->used > 0 && mp_cmp_d(&(a->co[a->used]), 0) == MP_EQ) --(a->used); -} - -/* add two polynomials, c(x) = a(x) + b(x) */ -int mp_poly_add(mp_poly *a, mp_poly *b, mp_poly *c) -{ - mp_poly t, *x, *y; - int res, k; - - /* ensure char's are the same */ - if (mp_cmp(&(a->cha), &(b->cha)) != MP_EQ) { - return MP_VAL; - } - - /* now figure out the sizes such that x is the - largest degree poly and y is less or equal in degree - */ - if (a->used > b->used) { - x = a; - y = b; - } else { - x = b; - y = a; - } - - /* now init the result to be a copy of the largest */ - if ((res = mp_poly_init_copy(&t, x)) != MP_OKAY) { - return res; - } - - /* now add the coeffcients of the smaller one */ - for (k = 0; k < y->used; k++) { - if ((res = mp_addmod(&(a->co[k]), &(b->co[k]), &(a->cha), &(t.co[k]))) != MP_OKAY) { - goto __T; - } - } - - mp_poly_clamp(&t); - mp_poly_exch(&t, c); - res = MP_OKAY; - -__T: mp_poly_clear(&t); - return res; -} - -/* subtracts two polynomials, c(x) = a(x) - b(x) */ -int mp_poly_sub(mp_poly *a, mp_poly *b, mp_poly *c) -{ - mp_poly t, *x, *y; - int res, k; - - /* ensure char's are the same */ - if (mp_cmp(&(a->cha), &(b->cha)) != MP_EQ) { - return MP_VAL; - } - - /* now figure out the sizes such that x is the - largest degree poly and y is less or equal in degree - */ - if (a->used > b->used) { - x = a; - y = b; - } else { - x = b; - y = a; - } - - /* now init the result to be a copy of the largest */ - if ((res = mp_poly_init_copy(&t, x)) != MP_OKAY) { - return res; - } - - /* now add the coeffcients of the smaller one */ - for (k = 0; k < y->used; k++) { - if ((res = mp_submod(&(a->co[k]), &(b->co[k]), &(a->cha), &(t.co[k]))) != MP_OKAY) { - goto __T; - } - } - - mp_poly_clamp(&t); - mp_poly_exch(&t, c); - res = MP_OKAY; - -__T: mp_poly_clear(&t); - return res; -} - -/* multiplies two polynomials, c(x) = a(x) * b(x) */ -int mp_poly_mul(mp_poly *a, mp_poly *b, mp_poly *c) -{ - mp_poly t; - mp_int tt; - int res, pa, pb, ix, iy; - - /* ensure char's are the same */ - if (mp_cmp(&(a->cha), &(b->cha)) != MP_EQ) { - return MP_VAL; - } - - /* degrees of a and b */ - pa = a->used; - pb = b->used; - - /* now init the temp polynomial to be of degree pa+pb */ - if ((res = mp_poly_init_size(&t, &(a->cha), pa+pb)) != MP_OKAY) { - return res; - } - - /* now init our temp int */ - if ((res = mp_init(&tt)) != MP_OKAY) { - goto __T; - } - - /* now loop through all the digits */ - for (ix = 0; ix < pa; ix++) { - for (iy = 0; iy < pb; iy++) { - if ((res = mp_mul(&(a->co[ix]), &(b->co[iy]), &tt)) != MP_OKAY) { - goto __TT; - } - if ((res = mp_addmod(&tt, &(t.co[ix+iy]), &(a->cha), &(t.co[ix+iy]))) != MP_OKAY) { - goto __TT; - } - } - } - - mp_poly_clamp(&t); - mp_poly_exch(&t, c); - res = MP_OKAY; - -__TT: mp_clear(&tt); -__T: mp_poly_clear(&t); - return res; -} - diff --git a/etclib/poly.h b/etclib/poly.h deleted file mode 100644 index f2e3212..0000000 --- a/etclib/poly.h +++ /dev/null @@ -1,73 +0,0 @@ -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * This file "poly.h" provides GF(p^k) functionality on top of the - * libtommath library. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://libtommath.iahu.ca - */ - -#ifndef POLY_H_ -#define POLY_H_ - -#include "bn.h" - -/* a mp_poly is basically a derived "class" of a mp_int - * it uses the same technique of growing arrays via - * used/alloc parameters except the base unit or "digit" - * is in fact a mp_int. These hold the coefficients - * of the polynomial - */ -typedef struct { - int used, /* coefficients used */ - alloc; /* coefficients allocated (and initialized) */ - mp_int *co, /* coefficients */ - cha; /* characteristic */ - -} mp_poly; - - -#define MP_POLY_PREC 16 /* default coefficients allocated */ - -/* init a poly */ -int mp_poly_init(mp_poly *a, mp_int *cha); - -/* init a poly of a given (size) degree */ -int mp_poly_init_size(mp_poly *a, mp_int *cha, int size); - -/* copy, b = a */ -int mp_poly_copy(mp_poly *a, mp_poly *b); - -/* init from a copy, a = b */ -int mp_poly_init_copy(mp_poly *a, mp_poly *b); - -/* free a poly from ram */ -void mp_poly_clear(mp_poly *a); - -/* exchange two polys */ -void mp_poly_exch(mp_poly *a, mp_poly *b); - -/* ---> Basic Arithmetic <--- */ - -/* add two polynomials, c(x) = a(x) + b(x) */ -int mp_poly_add(mp_poly *a, mp_poly *b, mp_poly *c); - -/* subtracts two polynomials, c(x) = a(x) - b(x) */ -int mp_poly_sub(mp_poly *a, mp_poly *b, mp_poly *c); - -/* multiplies two polynomials, c(x) = a(x) * b(x) */ -int mp_poly_mul(mp_poly *a, mp_poly *b, mp_poly *c); - - - -#endif - diff --git a/logs/add.log b/logs/add.log index 4921585..e53b415 100644 --- a/logs/add.log +++ b/logs/add.log @@ -1,16 +1,16 @@ -224 8622881 -448 7241417 -672 5844712 -896 4938016 -1120 4256543 -1344 3728000 -1568 3328263 -1792 3012161 -2016 2743688 -2240 2512095 -2464 2234464 -2688 1960139 -2912 2013395 -3136 1879636 -3360 1756301 -3584 1680982 +224 20297071 +448 15151383 +672 13088682 +896 11111587 +1120 9240621 +1344 8221878 +1568 7227434 +1792 6718051 +2016 6042524 +2240 5685200 +2464 5240465 +2688 4818032 +2912 4412794 +3136 4155883 +3360 3927078 +3584 3722138 diff --git a/logs/addsub.png b/logs/addsub.png index 3315272a4dc74f270cc6e31456ef825567c2927d..e733f8d7622be239c70d1708c6ef8c79ec12576d 100644 GIT binary patch literal 7084 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�b6R|d)pk7cpqszx>)5@= zG*YVkSPnP*9F&wQRzNleIV%K1iQCTO@mKdf)sdp{{b{a{%^9VNi}=#b2fnEyw#_hw z=eXqOi!P|tK_x?DOf|WR#zL#D4%llVof-Nzbhw~dI4ngoopoNmoS&11$9tAn3#(qb zpsQ8=57>&lARATbWzK5ux>&}IB6A;G(PqeIo5iBMAjpPo5m4w0*@QXCc?GbxQg~)2 zHX>)pX44H-u?m*4t}(vn0`8{bTRm!n-o9e!W2TDisP$@JDMkBfIx*Kkq;Drhd*H0N zJmA(0g{OF)l}X|KViNg|iDjrbUG~nN+B##0`duh}8YmAZABbU@Q+Qf@)(Q&mkmkj> z+H*_c0-!+j@)s`Lh`?u3!v#VObc#jk<#fc7#+fsN-G~&-8gQj(ncpV#nrlwe3sZ1J$Vk$^ z*s=wMU-VRa{2Zu;(E3Jq*!w)C!&M1t25U#I;G7&5jA7nt3fAa*YoF~3ut&bTmL`TR z3#|opIFwqg!9<2yTEvktm*a4J!>6`qqh%7=C!Y2wnmHm!8a7Zz@}pG@r=@89omS(a z5P8v!x!@#gHFYF-@2~I5oYGvuX@rZpVN#E|0YrAXkyJMte$EMHW*7#DR=Nu1VaKNA z9`KyYtKLfoyUMztWKnzT(PjLYXhqtpq#d3!Pt+1UJt8HK_i3zLlB_>^G|AR;=4A5m zw7Yl7g0m)mjb#cM{u>OzeLBE#rPHKr!&r9TgBEi3>jw;4=V{+Pv8;l75&IIRxtjE| z!D@3LJ*71~GU z@AfUT(oDsz#Ep?rTXZmN$&D6s1t&CJ`x@6CO?SA)@~2RXe=!Ci^6H`C9){pl zPcz^kc>MqWe6R_FC;I;!2markuP$GUa7T>4#;yt*&G0^(+?*{rTYT)8x18R?=8lUN zpNCZ9=G^1M*hkruv%X>8i}W7;JwF_IxjLetUqKa*yHvta~&ddyjuA<>Ce{eSL0moGa6VF~9uQ^$ga8!l*{oLOwuU6T8 zk4ks#jK&vV>4v`=Cm1U$u6are%@At$xDCHK`(|E5vBa%gPcopGP?#H(W}A8?_R08N!^*^r z5m&~bdSdIMLKzk|yHs<+vLSNq*F=fI(N`Uxu$odc-9K#C$_syus!3c6x%-WNit6}y zaW3+oyLwMgx5>n%PD%|QegiG)`=YNm%82v&0$e<5;pv%Ab)`Pq->UNOKTAj?=~B~G zGfnQ5%LccFO*m=`ZC;0##`^f8D+jA?Y&t%6nu}c;2w&CTsH{UC8Q&#EJJCNJIXzjj z-_rZ~p{SwAkF&Y{n^cNjcYCc2OWL%Zo$lRkvA0v~8@VyJVVBjNp64N3jlw&7?J?}q zy}Ga89u@SZ)cyI>L557f3*X=ubX>wV6tfH_Op$7^wrh8 fCEx~3>K%{D{m1lN$?NnaB3LIo7u(#;=&%0+DMbmE literal 6769 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 YHd{KM{eJE4F)VScx7k^gZ-tNjAMn|BO#lD@ literal 7393 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 jNvDgaWE}ndn<>xb5v$spIR2z41T~Fn - -LibTomMath Log Plots - - - -

Addition and Subtraction

-
-
- -

Multipliers

-
-
- -

Exptmod

-
-
- -

Modular Inverse

-
-
- - + + +LibTomMath Log Plots + + + +

Addition and Subtraction

+
+
+ +

Multipliers

+
+
+ +

Exptmod

+
+
+ +

Modular Inverse

+
+
+ + \ No newline at end of file diff --git a/logs/invmod.log b/logs/invmod.log index 1dec5cd..c9294ef 100644 --- a/logs/invmod.log +++ b/logs/invmod.log @@ -1,32 +1,32 @@ -112 14936 -224 7208 -336 6864 -448 5000 -560 3648 -672 1832 -784 1480 -896 1232 -1008 1010 -1120 1360 -1232 728 -1344 632 -1456 544 -1568 800 -1680 704 -1792 396 -1904 584 -2016 528 -2128 483 -2240 448 -2352 250 -2464 378 -2576 350 -2688 198 -2800 300 -2912 170 -3024 265 -3136 150 -3248 142 -3360 134 -3472 126 -3584 118 +112 17364 +224 8643 +336 8867 +448 6228 +560 4737 +672 2259 +784 2899 +896 1497 +1008 1238 +1120 1010 +1232 870 +1344 1265 +1456 1102 +1568 981 +1680 539 +1792 484 +1904 722 +2016 392 +2128 604 +2240 551 +2352 511 +2464 469 +2576 263 +2688 247 +2800 227 +2912 354 +3024 336 +3136 312 +3248 296 +3360 166 +3472 155 +3584 248 diff --git a/logs/invmod.png b/logs/invmod.png index 24866d5b6687f176e16fe48d41a402c8dadb61e1..baa287fe2085f953be78c2839236895241048624 100644 GIT binary patch literal 5735 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 diff --git a/logs/k7/index.html b/logs/k7/index.html index f3a5562..19fe403 100644 --- a/logs/k7/index.html +++ b/logs/k7/index.html @@ -1,24 +1,24 @@ - - -LibTomMath Log Plots - - - -

Addition and Subtraction

-
-
- -

Multipliers

-
-
- -

Exptmod

-
-
- -

Modular Inverse

-
-
- - + + +LibTomMath Log Plots + + + +

Addition and Subtraction

+
+
+ +

Multipliers

+
+
+ +

Exptmod

+
+
+ +

Modular Inverse

+
+
+ + \ No newline at end of file diff --git a/logs/mult.log b/logs/mult.log index 0501747..d4f5899 100644 --- a/logs/mult.log +++ b/logs/mult.log @@ -1,17 +1,33 @@ -896 348504 -1344 165040 -1792 98696 -2240 65400 -2688 46672 -3136 34968 -3584 27144 -4032 21648 -4480 17672 -4928 14768 -5376 12416 -5824 10696 -6272 9184 -6720 8064 -7168 1896 -7616 1680 -8064 1504 +920 374785 +1142 242737 +1371 176704 +1596 134341 +1816 105537 +2044 85089 +2268 70051 +2490 58671 +2716 49851 +2937 42881 +3162 37288 +3387 32697 +3608 28915 +3836 25759 +4057 23088 +4284 20800 +4508 18827 +4730 17164 +4956 15689 +5180 14397 +5398 13260 +5628 12249 +5852 11346 +6071 10537 +6298 9812 +6522 9161 +6742 8572 +6971 8038 +7195 2915 +7419 2744 +7644 2587 +7866 2444 +8090 2311 diff --git a/logs/mult.png b/logs/mult.png index ddc768041dc6cc9a3fb6c0a8412134b5eb0c67fe..d304db2ca210015c57a2d368cfe5efcf83d19295 100644 GIT binary patch literal 8100 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 literal 8199 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 l - -LibTomMath Log Plots - - - -

Addition and Subtraction

-
-
- -

Multipliers

-
-
- -

Exptmod

-
-
- -

Modular Inverse

-
-
- - + + +LibTomMath Log Plots + + + +

Addition and Subtraction

+
+
+ +

Multipliers

+
+
+ +

Exptmod

+
+
+ +

Modular Inverse

+
+
+ + \ No newline at end of file diff --git a/logs/sqr.log b/logs/sqr.log index ae1a929..81fa612 100644 --- a/logs/sqr.log +++ b/logs/sqr.log @@ -1,17 +1,33 @@ -911 167013 -1359 83796 -1807 50308 -2254 33637 -2703 24067 -3151 17997 -3599 5751 -4047 4561 -4490 3714 -4943 3067 -5391 2597 -5839 2204 -6286 1909 -6735 1637 -7183 1461 -7631 1302 -8078 1158 +922 471095 +1147 337137 +1366 254327 +1596 199732 +1819 161225 +2044 132852 +2268 111493 +2490 94864 +2715 81745 +2940 71187 +3162 62575 +3387 55418 +3612 14540 +3836 12944 +4060 11627 +4281 10546 +4508 9502 +4730 8688 +4954 7937 +5180 7273 +5402 6701 +5627 6189 +5850 5733 +6076 5310 +6300 4933 +6522 4631 +6748 4313 +6971 4064 +7196 3801 +7420 3576 +7642 3388 +7868 3191 +8092 3020 diff --git a/logs/sqr_kara.log b/logs/sqr_kara.log index 3c85942..3b547cf 100644 --- a/logs/sqr_kara.log +++ b/logs/sqr_kara.log @@ -1,17 +1,33 @@ -910 165312 -1358 84355 -1806 50316 -2255 33661 -2702 24027 -3151 18068 -3599 14721 -4046 12101 -4493 10112 -4942 8591 -5390 7364 -5839 6398 -6285 5607 -6735 4952 -7182 4625 -7631 4193 -8079 3810 +922 470930 +1148 337217 +1372 254433 +1596 199827 +1820 161204 +2043 132871 +2267 111522 +2488 94932 +2714 81814 +2939 71231 +3164 62616 +3385 55467 +3611 44426 +3836 40695 +4060 37391 +4283 34371 +4508 31779 +4732 29499 +4956 27426 +5177 25598 +5403 23944 +5628 22416 +5851 21052 +6076 19781 +6299 18588 +6523 17539 +6746 16618 +6972 15705 +7196 13582 +7420 13004 +7643 12496 +7868 11963 +8092 11497 diff --git a/logs/sub.log b/logs/sub.log index bf1d36f..f1ade94 100644 --- a/logs/sub.log +++ b/logs/sub.log @@ -1,16 +1,16 @@ -224 10295756 -448 7577910 -672 6279588 -896 5345182 -1120 4646989 -1344 4101759 -1568 3685447 -1792 3337497 -2016 3051095 -2240 2811900 -2464 2605371 -2688 2420561 -2912 2273174 -3136 2134662 -3360 2014354 -3584 1901723 +224 16370431 +448 13327848 +672 11009401 +896 9125342 +1120 7930419 +1344 7114040 +1568 6506998 +1792 5899346 +2016 5435327 +2240 5038931 +2464 4696364 +2688 4425678 +2912 4134476 +3136 3913280 +3360 3692536 +3584 3505219 diff --git a/makefile b/makefile index c7e2bc7..07b7842 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,7 @@ #Makefile for GCC # #Tom St Denis -CFLAGS += -I./ -Wall -W -Wshadow +CFLAGS += -I./ -Wall -W -Wshadow -Wsign-compare #for speed CFLAGS += -O3 -funroll-loops @@ -12,7 +12,7 @@ CFLAGS += -O3 -funroll-loops #x86 optimizations [should be valid for any GCC install though] CFLAGS += -fomit-frame-pointer -VERSION=0.29 +VERSION=0.30 default: libtommath.a @@ -50,7 +50,9 @@ bn_mp_toom_mul.o bn_mp_toom_sqr.o bn_mp_div_3.o bn_s_mp_exptmod.o \ bn_mp_reduce_2k.o bn_mp_reduce_is_2k.o bn_mp_reduce_2k_setup.o \ bn_mp_radix_smap.o bn_mp_read_radix.o bn_mp_toradix.o bn_mp_radix_size.o \ bn_mp_fread.o bn_mp_fwrite.o bn_mp_cnt_lsb.o bn_error.o \ -bn_mp_init_multi.o bn_mp_clear_multi.o bn_mp_prime_random.o bn_prime_sizes_tab.o bn_mp_exteuclid.o +bn_mp_init_multi.o bn_mp_clear_multi.o bn_prime_sizes_tab.o bn_mp_exteuclid.o bn_mp_toradix_n.o \ +bn_mp_prime_random_ex.o bn_mp_get_int.o bn_mp_sqrt.o bn_mp_is_square.o bn_mp_init_set.o \ +bn_mp_init_set_int.o libtommath.a: $(OBJECTS) $(AR) $(ARFLAGS) libtommath.a $(OBJECTS) @@ -64,6 +66,8 @@ install: libtommath.a test: libtommath.a demo/demo.o $(CC) demo/demo.o libtommath.a -o test + +mtest: test cd mtest ; $(CC) $(CFLAGS) mtest.c -o mtest -s timing: libtommath.a @@ -75,23 +79,18 @@ docdvi: tommath.src echo "hello" > tommath.ind perl booker.pl latex tommath > /dev/null + latex tommath > /dev/null makeindex tommath latex tommath > /dev/null - + # poster, makes the single page PDF poster poster: poster.tex pdflatex poster rm -f poster.aux poster.log -# makes the LTM book PS/PDF file, requires tetex, cleans up the LaTeX temp files -docs: - cd pics ; make pdfes - echo "hello" > tommath.ind - perl booker.pl PDF - latex tommath > /dev/null - makeindex tommath - latex tommath > /dev/null - pdflatex tommath +# makes the LTM book PDF file, requires tetex, cleans up the LaTeX temp files +docs: docdvi + dvipdf tommath rm -f tommath.log tommath.aux tommath.dvi tommath.idx tommath.toc tommath.lof tommath.ind tommath.ilg cd pics ; make clean @@ -99,6 +98,7 @@ docs: mandvi: bn.tex echo "hello" > bn.ind latex bn > /dev/null + latex bn > /dev/null makeindex bn latex bn > /dev/null diff --git a/makefile.bcc b/makefile.bcc index 7aba87c..6874d2f 100644 --- a/makefile.bcc +++ b/makefile.bcc @@ -29,12 +29,13 @@ bn_mp_toom_mul.obj bn_mp_toom_sqr.obj bn_mp_div_3.obj bn_s_mp_exptmod.obj \ bn_mp_reduce_2k.obj bn_mp_reduce_is_2k.obj bn_mp_reduce_2k_setup.obj \ bn_mp_radix_smap.obj bn_mp_read_radix.obj bn_mp_toradix.obj bn_mp_radix_size.obj \ bn_mp_fread.obj bn_mp_fwrite.obj bn_mp_cnt_lsb.obj bn_error.obj \ -bn_mp_init_multi.obj bn_mp_clear_multi.obj bn_mp_prime_random.obj bn_prime_sizes_tab.obj bn_mp_exteuclid.obj +bn_mp_init_multi.obj bn_mp_clear_multi.obj bn_prime_sizes_tab.obj bn_mp_exteuclid.obj bn_mp_toradix_n.obj \ +bn_mp_prime_random_ex.obj bn_mp_get_int.obj bn_mp_sqrt.obj bn_mp_is_square.obj TARGET = libtommath.lib $(TARGET): $(OBJECTS) -.c.objbj: +.c.objbjbjbj: $(CC) $(CFLAGS) $< $(LIB) $(TARGET) -+$@ diff --git a/makefile.cygwin_dll b/makefile.cygwin_dll index c7cfc13..e5ab814 100644 --- a/makefile.cygwin_dll +++ b/makefile.cygwin_dll @@ -34,7 +34,8 @@ bn_mp_toom_mul.o bn_mp_toom_sqr.o bn_mp_div_3.o bn_s_mp_exptmod.o \ bn_mp_reduce_2k.o bn_mp_reduce_is_2k.o bn_mp_reduce_2k_setup.o \ bn_mp_radix_smap.o bn_mp_read_radix.o bn_mp_toradix.o bn_mp_radix_size.o \ bn_mp_fread.o bn_mp_fwrite.o bn_mp_cnt_lsb.o bn_error.o \ -bn_mp_init_multi.o bn_mp_clear_multi.o bn_mp_prime_random.o bn_prime_sizes_tab.o bn_mp_exteuclid.o +bn_mp_init_multi.o bn_mp_clear_multi.o bn_prime_sizes_tab.o bn_mp_exteuclid.o bn_mp_toradix_n.o \ +bn_mp_prime_random_ex.o bn_mp_get_int.o bn_mp_sqrt.o bn_mp_is_square.o # make a Windows DLL via Cygwin windll: $(OBJECTS) diff --git a/makefile.msvc b/makefile.msvc index 1789871..beeb77e 100644 --- a/makefile.msvc +++ b/makefile.msvc @@ -28,7 +28,8 @@ bn_mp_toom_mul.obj bn_mp_toom_sqr.obj bn_mp_div_3.obj bn_s_mp_exptmod.obj \ bn_mp_reduce_2k.obj bn_mp_reduce_is_2k.obj bn_mp_reduce_2k_setup.obj \ bn_mp_radix_smap.obj bn_mp_read_radix.obj bn_mp_toradix.obj bn_mp_radix_size.obj \ bn_mp_fread.obj bn_mp_fwrite.obj bn_mp_cnt_lsb.obj bn_error.obj \ -bn_mp_init_multi.obj bn_mp_clear_multi.obj bn_mp_prime_random.obj bn_prime_sizes_tab.obj bn_mp_exteuclid.obj +bn_mp_init_multi.obj bn_mp_clear_multi.obj bn_prime_sizes_tab.obj bn_mp_exteuclid.obj bn_mp_toradix_n.obj \ +bn_mp_prime_random_ex.obj bn_mp_get_int.obj bn_mp_sqrt.obj bn_mp_is_square.obj library: $(OBJECTS) lib /out:tommath.lib $(OBJECTS) diff --git a/mtest/logtab.h b/mtest/logtab.h index 6ed1bae..68462bd 100644 --- a/mtest/logtab.h +++ b/mtest/logtab.h @@ -1,20 +1,20 @@ -const float s_logv_2[] = { - 0.000000000, 0.000000000, 1.000000000, 0.630929754, /* 0 1 2 3 */ - 0.500000000, 0.430676558, 0.386852807, 0.356207187, /* 4 5 6 7 */ - 0.333333333, 0.315464877, 0.301029996, 0.289064826, /* 8 9 10 11 */ - 0.278942946, 0.270238154, 0.262649535, 0.255958025, /* 12 13 14 15 */ - 0.250000000, 0.244650542, 0.239812467, 0.235408913, /* 16 17 18 19 */ - 0.231378213, 0.227670249, 0.224243824, 0.221064729, /* 20 21 22 23 */ - 0.218104292, 0.215338279, 0.212746054, 0.210309918, /* 24 25 26 27 */ - 0.208014598, 0.205846832, 0.203795047, 0.201849087, /* 28 29 30 31 */ - 0.200000000, 0.198239863, 0.196561632, 0.194959022, /* 32 33 34 35 */ - 0.193426404, 0.191958720, 0.190551412, 0.189200360, /* 36 37 38 39 */ - 0.187901825, 0.186652411, 0.185449023, 0.184288833, /* 40 41 42 43 */ - 0.183169251, 0.182087900, 0.181042597, 0.180031327, /* 44 45 46 47 */ - 0.179052232, 0.178103594, 0.177183820, 0.176291434, /* 48 49 50 51 */ - 0.175425064, 0.174583430, 0.173765343, 0.172969690, /* 52 53 54 55 */ - 0.172195434, 0.171441601, 0.170707280, 0.169991616, /* 56 57 58 59 */ - 0.169293808, 0.168613099, 0.167948779, 0.167300179, /* 60 61 62 63 */ - 0.166666667 -}; - +const float s_logv_2[] = { + 0.000000000, 0.000000000, 1.000000000, 0.630929754, /* 0 1 2 3 */ + 0.500000000, 0.430676558, 0.386852807, 0.356207187, /* 4 5 6 7 */ + 0.333333333, 0.315464877, 0.301029996, 0.289064826, /* 8 9 10 11 */ + 0.278942946, 0.270238154, 0.262649535, 0.255958025, /* 12 13 14 15 */ + 0.250000000, 0.244650542, 0.239812467, 0.235408913, /* 16 17 18 19 */ + 0.231378213, 0.227670249, 0.224243824, 0.221064729, /* 20 21 22 23 */ + 0.218104292, 0.215338279, 0.212746054, 0.210309918, /* 24 25 26 27 */ + 0.208014598, 0.205846832, 0.203795047, 0.201849087, /* 28 29 30 31 */ + 0.200000000, 0.198239863, 0.196561632, 0.194959022, /* 32 33 34 35 */ + 0.193426404, 0.191958720, 0.190551412, 0.189200360, /* 36 37 38 39 */ + 0.187901825, 0.186652411, 0.185449023, 0.184288833, /* 40 41 42 43 */ + 0.183169251, 0.182087900, 0.181042597, 0.180031327, /* 44 45 46 47 */ + 0.179052232, 0.178103594, 0.177183820, 0.176291434, /* 48 49 50 51 */ + 0.175425064, 0.174583430, 0.173765343, 0.172969690, /* 52 53 54 55 */ + 0.172195434, 0.171441601, 0.170707280, 0.169991616, /* 56 57 58 59 */ + 0.169293808, 0.168613099, 0.167948779, 0.167300179, /* 60 61 62 63 */ + 0.166666667 +}; + diff --git a/mtest/mpi-config.h b/mtest/mpi-config.h index 6efe574..9277dfb 100644 --- a/mtest/mpi-config.h +++ b/mtest/mpi-config.h @@ -1,86 +1,86 @@ -/* Default configuration for MPI library */ -/* $ID$ */ - -#ifndef MPI_CONFIG_H_ -#define MPI_CONFIG_H_ - -/* - For boolean options, - 0 = no - 1 = yes - - Other options are documented individually. - - */ - -#ifndef MP_IOFUNC -#define MP_IOFUNC 0 /* include mp_print() ? */ -#endif - -#ifndef MP_MODARITH -#define MP_MODARITH 1 /* include modular arithmetic ? */ -#endif - -#ifndef MP_NUMTH -#define MP_NUMTH 1 /* include number theoretic functions? */ -#endif - -#ifndef MP_LOGTAB -#define MP_LOGTAB 1 /* use table of logs instead of log()? */ -#endif - -#ifndef MP_MEMSET -#define MP_MEMSET 1 /* use memset() to zero buffers? */ -#endif - -#ifndef MP_MEMCPY -#define MP_MEMCPY 1 /* use memcpy() to copy buffers? */ -#endif - -#ifndef MP_CRYPTO -#define MP_CRYPTO 1 /* erase memory on free? */ -#endif - -#ifndef MP_ARGCHK -/* - 0 = no parameter checks - 1 = runtime checks, continue execution and return an error to caller - 2 = assertions; dump core on parameter errors - */ -#define MP_ARGCHK 2 /* how to check input arguments */ -#endif - -#ifndef MP_DEBUG -#define MP_DEBUG 0 /* print diagnostic output? */ -#endif - -#ifndef MP_DEFPREC -#define MP_DEFPREC 64 /* default precision, in digits */ -#endif - -#ifndef MP_MACRO -#define MP_MACRO 1 /* use macros for frequent calls? */ -#endif - -#ifndef MP_SQUARE -#define MP_SQUARE 1 /* use separate squaring code? */ -#endif - -#ifndef MP_PTAB_SIZE -/* - When building mpprime.c, we build in a table of small prime - values to use for primality testing. The more you include, - the more space they take up. See primes.c for the possible - values (currently 16, 32, 64, 128, 256, and 6542) - */ -#define MP_PTAB_SIZE 128 /* how many built-in primes? */ -#endif - -#ifndef MP_COMPAT_MACROS -#define MP_COMPAT_MACROS 1 /* define compatibility macros? */ -#endif - -#endif /* ifndef MPI_CONFIG_H_ */ - - -/* crc==3287762869, version==2, Sat Feb 02 06:43:53 2002 */ +/* Default configuration for MPI library */ +/* $ID$ */ + +#ifndef MPI_CONFIG_H_ +#define MPI_CONFIG_H_ + +/* + For boolean options, + 0 = no + 1 = yes + + Other options are documented individually. + + */ + +#ifndef MP_IOFUNC +#define MP_IOFUNC 0 /* include mp_print() ? */ +#endif + +#ifndef MP_MODARITH +#define MP_MODARITH 1 /* include modular arithmetic ? */ +#endif + +#ifndef MP_NUMTH +#define MP_NUMTH 1 /* include number theoretic functions? */ +#endif + +#ifndef MP_LOGTAB +#define MP_LOGTAB 1 /* use table of logs instead of log()? */ +#endif + +#ifndef MP_MEMSET +#define MP_MEMSET 1 /* use memset() to zero buffers? */ +#endif + +#ifndef MP_MEMCPY +#define MP_MEMCPY 1 /* use memcpy() to copy buffers? */ +#endif + +#ifndef MP_CRYPTO +#define MP_CRYPTO 1 /* erase memory on free? */ +#endif + +#ifndef MP_ARGCHK +/* + 0 = no parameter checks + 1 = runtime checks, continue execution and return an error to caller + 2 = assertions; dump core on parameter errors + */ +#define MP_ARGCHK 2 /* how to check input arguments */ +#endif + +#ifndef MP_DEBUG +#define MP_DEBUG 0 /* print diagnostic output? */ +#endif + +#ifndef MP_DEFPREC +#define MP_DEFPREC 64 /* default precision, in digits */ +#endif + +#ifndef MP_MACRO +#define MP_MACRO 1 /* use macros for frequent calls? */ +#endif + +#ifndef MP_SQUARE +#define MP_SQUARE 1 /* use separate squaring code? */ +#endif + +#ifndef MP_PTAB_SIZE +/* + When building mpprime.c, we build in a table of small prime + values to use for primality testing. The more you include, + the more space they take up. See primes.c for the possible + values (currently 16, 32, 64, 128, 256, and 6542) + */ +#define MP_PTAB_SIZE 128 /* how many built-in primes? */ +#endif + +#ifndef MP_COMPAT_MACROS +#define MP_COMPAT_MACROS 1 /* define compatibility macros? */ +#endif + +#endif /* ifndef MPI_CONFIG_H_ */ + + +/* crc==3287762869, version==2, Sat Feb 02 06:43:53 2002 */ diff --git a/mtest/mpi.c b/mtest/mpi.c index 96066c3..94019ef 100644 --- a/mtest/mpi.c +++ b/mtest/mpi.c @@ -1,3981 +1,3981 @@ -/* - mpi.c - - by Michael J. Fromberger - Copyright (C) 1998 Michael J. Fromberger, All Rights Reserved - - Arbitrary precision integer arithmetic library - - $ID$ - */ - -#include "mpi.h" -#include -#include -#include - -#if MP_DEBUG -#include - -#define DIAG(T,V) {fprintf(stderr,T);mp_print(V,stderr);fputc('\n',stderr);} -#else -#define DIAG(T,V) -#endif - -/* - If MP_LOGTAB is not defined, use the math library to compute the - logarithms on the fly. Otherwise, use the static table below. - Pick which works best for your system. - */ -#if MP_LOGTAB - -/* {{{ s_logv_2[] - log table for 2 in various bases */ - -/* - A table of the logs of 2 for various bases (the 0 and 1 entries of - this table are meaningless and should not be referenced). - - This table is used to compute output lengths for the mp_toradix() - function. Since a number n in radix r takes up about log_r(n) - digits, we estimate the output size by taking the least integer - greater than log_r(n), where: - - log_r(n) = log_2(n) * log_r(2) - - This table, therefore, is a table of log_r(2) for 2 <= r <= 36, - which are the output bases supported. - */ - -#include "logtab.h" - -/* }}} */ -#define LOG_V_2(R) s_logv_2[(R)] - -#else - -#include -#define LOG_V_2(R) (log(2.0)/log(R)) - -#endif - -/* Default precision for newly created mp_int's */ -static unsigned int s_mp_defprec = MP_DEFPREC; - -/* {{{ Digit arithmetic macros */ - -/* - When adding and multiplying digits, the results can be larger than - can be contained in an mp_digit. Thus, an mp_word is used. These - macros mask off the upper and lower digits of the mp_word (the - mp_word may be more than 2 mp_digits wide, but we only concern - ourselves with the low-order 2 mp_digits) - - If your mp_word DOES have more than 2 mp_digits, you need to - uncomment the first line, and comment out the second. - */ - -/* #define CARRYOUT(W) (((W)>>DIGIT_BIT)&MP_DIGIT_MAX) */ -#define CARRYOUT(W) ((W)>>DIGIT_BIT) -#define ACCUM(W) ((W)&MP_DIGIT_MAX) - -/* }}} */ - -/* {{{ Comparison constants */ - -#define MP_LT -1 -#define MP_EQ 0 -#define MP_GT 1 - -/* }}} */ - -/* {{{ Constant strings */ - -/* Constant strings returned by mp_strerror() */ -static const char *mp_err_string[] = { - "unknown result code", /* say what? */ - "boolean true", /* MP_OKAY, MP_YES */ - "boolean false", /* MP_NO */ - "out of memory", /* MP_MEM */ - "argument out of range", /* MP_RANGE */ - "invalid input parameter", /* MP_BADARG */ - "result is undefined" /* MP_UNDEF */ -}; - -/* Value to digit maps for radix conversion */ - -/* s_dmap_1 - standard digits and letters */ -static const char *s_dmap_1 = - "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; - -#if 0 -/* s_dmap_2 - base64 ordering for digits */ -static const char *s_dmap_2 = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -#endif - -/* }}} */ - -/* {{{ Static function declarations */ - -/* - If MP_MACRO is false, these will be defined as actual functions; - otherwise, suitable macro definitions will be used. This works - around the fact that ANSI C89 doesn't support an 'inline' keyword - (although I hear C9x will ... about bloody time). At present, the - macro definitions are identical to the function bodies, but they'll - expand in place, instead of generating a function call. - - I chose these particular functions to be made into macros because - some profiling showed they are called a lot on a typical workload, - and yet they are primarily housekeeping. - */ -#if MP_MACRO == 0 - void s_mp_setz(mp_digit *dp, mp_size count); /* zero digits */ - void s_mp_copy(mp_digit *sp, mp_digit *dp, mp_size count); /* copy */ - void *s_mp_alloc(size_t nb, size_t ni); /* general allocator */ - void s_mp_free(void *ptr); /* general free function */ -#else - - /* Even if these are defined as macros, we need to respect the settings - of the MP_MEMSET and MP_MEMCPY configuration options... - */ - #if MP_MEMSET == 0 - #define s_mp_setz(dp, count) \ - {int ix;for(ix=0;ix<(count);ix++)(dp)[ix]=0;} - #else - #define s_mp_setz(dp, count) memset(dp, 0, (count) * sizeof(mp_digit)) - #endif /* MP_MEMSET */ - - #if MP_MEMCPY == 0 - #define s_mp_copy(sp, dp, count) \ - {int ix;for(ix=0;ix<(count);ix++)(dp)[ix]=(sp)[ix];} - #else - #define s_mp_copy(sp, dp, count) memcpy(dp, sp, (count) * sizeof(mp_digit)) - #endif /* MP_MEMCPY */ - - #define s_mp_alloc(nb, ni) calloc(nb, ni) - #define s_mp_free(ptr) {if(ptr) free(ptr);} -#endif /* MP_MACRO */ - -mp_err s_mp_grow(mp_int *mp, mp_size min); /* increase allocated size */ -mp_err s_mp_pad(mp_int *mp, mp_size min); /* left pad with zeroes */ - -void s_mp_clamp(mp_int *mp); /* clip leading zeroes */ - -void s_mp_exch(mp_int *a, mp_int *b); /* swap a and b in place */ - -mp_err s_mp_lshd(mp_int *mp, mp_size p); /* left-shift by p digits */ -void s_mp_rshd(mp_int *mp, mp_size p); /* right-shift by p digits */ -void s_mp_div_2d(mp_int *mp, mp_digit d); /* divide by 2^d in place */ -void s_mp_mod_2d(mp_int *mp, mp_digit d); /* modulo 2^d in place */ -mp_err s_mp_mul_2d(mp_int *mp, mp_digit d); /* multiply by 2^d in place*/ -void s_mp_div_2(mp_int *mp); /* divide by 2 in place */ -mp_err s_mp_mul_2(mp_int *mp); /* multiply by 2 in place */ -mp_digit s_mp_norm(mp_int *a, mp_int *b); /* normalize for division */ -mp_err s_mp_add_d(mp_int *mp, mp_digit d); /* unsigned digit addition */ -mp_err s_mp_sub_d(mp_int *mp, mp_digit d); /* unsigned digit subtract */ -mp_err s_mp_mul_d(mp_int *mp, mp_digit d); /* unsigned digit multiply */ -mp_err s_mp_div_d(mp_int *mp, mp_digit d, mp_digit *r); - /* unsigned digit divide */ -mp_err s_mp_reduce(mp_int *x, mp_int *m, mp_int *mu); - /* Barrett reduction */ -mp_err s_mp_add(mp_int *a, mp_int *b); /* magnitude addition */ -mp_err s_mp_sub(mp_int *a, mp_int *b); /* magnitude subtract */ -mp_err s_mp_mul(mp_int *a, mp_int *b); /* magnitude multiply */ -#if 0 -void s_mp_kmul(mp_digit *a, mp_digit *b, mp_digit *out, mp_size len); - /* multiply buffers in place */ -#endif -#if MP_SQUARE -mp_err s_mp_sqr(mp_int *a); /* magnitude square */ -#else -#define s_mp_sqr(a) s_mp_mul(a, a) -#endif -mp_err s_mp_div(mp_int *a, mp_int *b); /* magnitude divide */ -mp_err s_mp_2expt(mp_int *a, mp_digit k); /* a = 2^k */ -int s_mp_cmp(mp_int *a, mp_int *b); /* magnitude comparison */ -int s_mp_cmp_d(mp_int *a, mp_digit d); /* magnitude digit compare */ -int s_mp_ispow2(mp_int *v); /* is v a power of 2? */ -int s_mp_ispow2d(mp_digit d); /* is d a power of 2? */ - -int s_mp_tovalue(char ch, int r); /* convert ch to value */ -char s_mp_todigit(int val, int r, int low); /* convert val to digit */ -int s_mp_outlen(int bits, int r); /* output length in bytes */ - -/* }}} */ - -/* {{{ Default precision manipulation */ - -unsigned int mp_get_prec(void) -{ - return s_mp_defprec; - -} /* end mp_get_prec() */ - -void mp_set_prec(unsigned int prec) -{ - if(prec == 0) - s_mp_defprec = MP_DEFPREC; - else - s_mp_defprec = prec; - -} /* end mp_set_prec() */ - -/* }}} */ - -/*------------------------------------------------------------------------*/ -/* {{{ mp_init(mp) */ - -/* - mp_init(mp) - - Initialize a new zero-valued mp_int. Returns MP_OKAY if successful, - MP_MEM if memory could not be allocated for the structure. - */ - -mp_err mp_init(mp_int *mp) -{ - return mp_init_size(mp, s_mp_defprec); - -} /* end mp_init() */ - -/* }}} */ - -/* {{{ mp_init_array(mp[], count) */ - -mp_err mp_init_array(mp_int mp[], int count) -{ - mp_err res; - int pos; - - ARGCHK(mp !=NULL && count > 0, MP_BADARG); - - for(pos = 0; pos < count; ++pos) { - if((res = mp_init(&mp[pos])) != MP_OKAY) - goto CLEANUP; - } - - return MP_OKAY; - - CLEANUP: - while(--pos >= 0) - mp_clear(&mp[pos]); - - return res; - -} /* end mp_init_array() */ - -/* }}} */ - -/* {{{ mp_init_size(mp, prec) */ - -/* - mp_init_size(mp, prec) - - Initialize a new zero-valued mp_int with at least the given - precision; returns MP_OKAY if successful, or MP_MEM if memory could - not be allocated for the structure. - */ - -mp_err mp_init_size(mp_int *mp, mp_size prec) -{ - ARGCHK(mp != NULL && prec > 0, MP_BADARG); - - if((DIGITS(mp) = s_mp_alloc(prec, sizeof(mp_digit))) == NULL) - return MP_MEM; - - SIGN(mp) = MP_ZPOS; - USED(mp) = 1; - ALLOC(mp) = prec; - - return MP_OKAY; - -} /* end mp_init_size() */ - -/* }}} */ - -/* {{{ mp_init_copy(mp, from) */ - -/* - mp_init_copy(mp, from) - - Initialize mp as an exact copy of from. Returns MP_OKAY if - successful, MP_MEM if memory could not be allocated for the new - structure. - */ - -mp_err mp_init_copy(mp_int *mp, mp_int *from) -{ - ARGCHK(mp != NULL && from != NULL, MP_BADARG); - - if(mp == from) - return MP_OKAY; - - if((DIGITS(mp) = s_mp_alloc(USED(from), sizeof(mp_digit))) == NULL) - return MP_MEM; - - s_mp_copy(DIGITS(from), DIGITS(mp), USED(from)); - USED(mp) = USED(from); - ALLOC(mp) = USED(from); - SIGN(mp) = SIGN(from); - - return MP_OKAY; - -} /* end mp_init_copy() */ - -/* }}} */ - -/* {{{ mp_copy(from, to) */ - -/* - mp_copy(from, to) - - Copies the mp_int 'from' to the mp_int 'to'. It is presumed that - 'to' has already been initialized (if not, use mp_init_copy() - instead). If 'from' and 'to' are identical, nothing happens. - */ - -mp_err mp_copy(mp_int *from, mp_int *to) -{ - ARGCHK(from != NULL && to != NULL, MP_BADARG); - - if(from == to) - return MP_OKAY; - - { /* copy */ - mp_digit *tmp; - - /* - If the allocated buffer in 'to' already has enough space to hold - all the used digits of 'from', we'll re-use it to avoid hitting - the memory allocater more than necessary; otherwise, we'd have - to grow anyway, so we just allocate a hunk and make the copy as - usual - */ - if(ALLOC(to) >= USED(from)) { - s_mp_setz(DIGITS(to) + USED(from), ALLOC(to) - USED(from)); - s_mp_copy(DIGITS(from), DIGITS(to), USED(from)); - - } else { - if((tmp = s_mp_alloc(USED(from), sizeof(mp_digit))) == NULL) - return MP_MEM; - - s_mp_copy(DIGITS(from), tmp, USED(from)); - - if(DIGITS(to) != NULL) { -#if MP_CRYPTO - s_mp_setz(DIGITS(to), ALLOC(to)); -#endif - s_mp_free(DIGITS(to)); - } - - DIGITS(to) = tmp; - ALLOC(to) = USED(from); - } - - /* Copy the precision and sign from the original */ - USED(to) = USED(from); - SIGN(to) = SIGN(from); - } /* end copy */ - - return MP_OKAY; - -} /* end mp_copy() */ - -/* }}} */ - -/* {{{ mp_exch(mp1, mp2) */ - -/* - mp_exch(mp1, mp2) - - Exchange mp1 and mp2 without allocating any intermediate memory - (well, unless you count the stack space needed for this call and the - locals it creates...). This cannot fail. - */ - -void mp_exch(mp_int *mp1, mp_int *mp2) -{ -#if MP_ARGCHK == 2 - assert(mp1 != NULL && mp2 != NULL); -#else - if(mp1 == NULL || mp2 == NULL) - return; -#endif - - s_mp_exch(mp1, mp2); - -} /* end mp_exch() */ - -/* }}} */ - -/* {{{ mp_clear(mp) */ - -/* - mp_clear(mp) - - Release the storage used by an mp_int, and void its fields so that - if someone calls mp_clear() again for the same int later, we won't - get tollchocked. - */ - -void mp_clear(mp_int *mp) -{ - if(mp == NULL) - return; - - if(DIGITS(mp) != NULL) { -#if MP_CRYPTO - s_mp_setz(DIGITS(mp), ALLOC(mp)); -#endif - s_mp_free(DIGITS(mp)); - DIGITS(mp) = NULL; - } - - USED(mp) = 0; - ALLOC(mp) = 0; - -} /* end mp_clear() */ - -/* }}} */ - -/* {{{ mp_clear_array(mp[], count) */ - -void mp_clear_array(mp_int mp[], int count) -{ - ARGCHK(mp != NULL && count > 0, MP_BADARG); - - while(--count >= 0) - mp_clear(&mp[count]); - -} /* end mp_clear_array() */ - -/* }}} */ - -/* {{{ mp_zero(mp) */ - -/* - mp_zero(mp) - - Set mp to zero. Does not change the allocated size of the structure, - and therefore cannot fail (except on a bad argument, which we ignore) - */ -void mp_zero(mp_int *mp) -{ - if(mp == NULL) - return; - - s_mp_setz(DIGITS(mp), ALLOC(mp)); - USED(mp) = 1; - SIGN(mp) = MP_ZPOS; - -} /* end mp_zero() */ - -/* }}} */ - -/* {{{ mp_set(mp, d) */ - -void mp_set(mp_int *mp, mp_digit d) -{ - if(mp == NULL) - return; - - mp_zero(mp); - DIGIT(mp, 0) = d; - -} /* end mp_set() */ - -/* }}} */ - -/* {{{ mp_set_int(mp, z) */ - -mp_err mp_set_int(mp_int *mp, long z) -{ - int ix; - unsigned long v = abs(z); - mp_err res; - - ARGCHK(mp != NULL, MP_BADARG); - - mp_zero(mp); - if(z == 0) - return MP_OKAY; /* shortcut for zero */ - - for(ix = sizeof(long) - 1; ix >= 0; ix--) { - - if((res = s_mp_mul_2d(mp, CHAR_BIT)) != MP_OKAY) - return res; - - res = s_mp_add_d(mp, - (mp_digit)((v >> (ix * CHAR_BIT)) & UCHAR_MAX)); - if(res != MP_OKAY) - return res; - - } - - if(z < 0) - SIGN(mp) = MP_NEG; - - return MP_OKAY; - -} /* end mp_set_int() */ - -/* }}} */ - -/*------------------------------------------------------------------------*/ -/* {{{ Digit arithmetic */ - -/* {{{ mp_add_d(a, d, b) */ - -/* - mp_add_d(a, d, b) - - Compute the sum b = a + d, for a single digit d. Respects the sign of - its primary addend (single digits are unsigned anyway). - */ - -mp_err mp_add_d(mp_int *a, mp_digit d, mp_int *b) -{ - mp_err res = MP_OKAY; - - ARGCHK(a != NULL && b != NULL, MP_BADARG); - - if((res = mp_copy(a, b)) != MP_OKAY) - return res; - - if(SIGN(b) == MP_ZPOS) { - res = s_mp_add_d(b, d); - } else if(s_mp_cmp_d(b, d) >= 0) { - res = s_mp_sub_d(b, d); - } else { - SIGN(b) = MP_ZPOS; - - DIGIT(b, 0) = d - DIGIT(b, 0); - } - - return res; - -} /* end mp_add_d() */ - -/* }}} */ - -/* {{{ mp_sub_d(a, d, b) */ - -/* - mp_sub_d(a, d, b) - - Compute the difference b = a - d, for a single digit d. Respects the - sign of its subtrahend (single digits are unsigned anyway). - */ - -mp_err mp_sub_d(mp_int *a, mp_digit d, mp_int *b) -{ - mp_err res; - - ARGCHK(a != NULL && b != NULL, MP_BADARG); - - if((res = mp_copy(a, b)) != MP_OKAY) - return res; - - if(SIGN(b) == MP_NEG) { - if((res = s_mp_add_d(b, d)) != MP_OKAY) - return res; - - } else if(s_mp_cmp_d(b, d) >= 0) { - if((res = s_mp_sub_d(b, d)) != MP_OKAY) - return res; - - } else { - mp_neg(b, b); - - DIGIT(b, 0) = d - DIGIT(b, 0); - SIGN(b) = MP_NEG; - } - - if(s_mp_cmp_d(b, 0) == 0) - SIGN(b) = MP_ZPOS; - - return MP_OKAY; - -} /* end mp_sub_d() */ - -/* }}} */ - -/* {{{ mp_mul_d(a, d, b) */ - -/* - mp_mul_d(a, d, b) - - Compute the product b = a * d, for a single digit d. Respects the sign - of its multiplicand (single digits are unsigned anyway) - */ - -mp_err mp_mul_d(mp_int *a, mp_digit d, mp_int *b) -{ - mp_err res; - - ARGCHK(a != NULL && b != NULL, MP_BADARG); - - if(d == 0) { - mp_zero(b); - return MP_OKAY; - } - - if((res = mp_copy(a, b)) != MP_OKAY) - return res; - - res = s_mp_mul_d(b, d); - - return res; - -} /* end mp_mul_d() */ - -/* }}} */ - -/* {{{ mp_mul_2(a, c) */ - -mp_err mp_mul_2(mp_int *a, mp_int *c) -{ - mp_err res; - - ARGCHK(a != NULL && c != NULL, MP_BADARG); - - if((res = mp_copy(a, c)) != MP_OKAY) - return res; - - return s_mp_mul_2(c); - -} /* end mp_mul_2() */ - -/* }}} */ - -/* {{{ mp_div_d(a, d, q, r) */ - -/* - mp_div_d(a, d, q, r) - - Compute the quotient q = a / d and remainder r = a mod d, for a - single digit d. Respects the sign of its divisor (single digits are - unsigned anyway). - */ - -mp_err mp_div_d(mp_int *a, mp_digit d, mp_int *q, mp_digit *r) -{ - mp_err res; - mp_digit rem; - int pow; - - ARGCHK(a != NULL, MP_BADARG); - - if(d == 0) - return MP_RANGE; - - /* Shortcut for powers of two ... */ - if((pow = s_mp_ispow2d(d)) >= 0) { - mp_digit mask; - - mask = (1 << pow) - 1; - rem = DIGIT(a, 0) & mask; - - if(q) { - mp_copy(a, q); - s_mp_div_2d(q, pow); - } - - if(r) - *r = rem; - - return MP_OKAY; - } - - /* - If the quotient is actually going to be returned, we'll try to - avoid hitting the memory allocator by copying the dividend into it - and doing the division there. This can't be any _worse_ than - always copying, and will sometimes be better (since it won't make - another copy) - - If it's not going to be returned, we need to allocate a temporary - to hold the quotient, which will just be discarded. - */ - if(q) { - if((res = mp_copy(a, q)) != MP_OKAY) - return res; - - res = s_mp_div_d(q, d, &rem); - if(s_mp_cmp_d(q, 0) == MP_EQ) - SIGN(q) = MP_ZPOS; - - } else { - mp_int qp; - - if((res = mp_init_copy(&qp, a)) != MP_OKAY) - return res; - - res = s_mp_div_d(&qp, d, &rem); - if(s_mp_cmp_d(&qp, 0) == 0) - SIGN(&qp) = MP_ZPOS; - - mp_clear(&qp); - } - - if(r) - *r = rem; - - return res; - -} /* end mp_div_d() */ - -/* }}} */ - -/* {{{ mp_div_2(a, c) */ - -/* - mp_div_2(a, c) - - Compute c = a / 2, disregarding the remainder. - */ - -mp_err mp_div_2(mp_int *a, mp_int *c) -{ - mp_err res; - - ARGCHK(a != NULL && c != NULL, MP_BADARG); - - if((res = mp_copy(a, c)) != MP_OKAY) - return res; - - s_mp_div_2(c); - - return MP_OKAY; - -} /* end mp_div_2() */ - -/* }}} */ - -/* {{{ mp_expt_d(a, d, b) */ - -mp_err mp_expt_d(mp_int *a, mp_digit d, mp_int *c) -{ - mp_int s, x; - mp_err res; - - ARGCHK(a != NULL && c != NULL, MP_BADARG); - - if((res = mp_init(&s)) != MP_OKAY) - return res; - if((res = mp_init_copy(&x, a)) != MP_OKAY) - goto X; - - DIGIT(&s, 0) = 1; - - while(d != 0) { - if(d & 1) { - if((res = s_mp_mul(&s, &x)) != MP_OKAY) - goto CLEANUP; - } - - d >>= 1; - - if((res = s_mp_sqr(&x)) != MP_OKAY) - goto CLEANUP; - } - - s_mp_exch(&s, c); - -CLEANUP: - mp_clear(&x); -X: - mp_clear(&s); - - return res; - -} /* end mp_expt_d() */ - -/* }}} */ - -/* }}} */ - -/*------------------------------------------------------------------------*/ -/* {{{ Full arithmetic */ - -/* {{{ mp_abs(a, b) */ - -/* - mp_abs(a, b) - - Compute b = |a|. 'a' and 'b' may be identical. - */ - -mp_err mp_abs(mp_int *a, mp_int *b) -{ - mp_err res; - - ARGCHK(a != NULL && b != NULL, MP_BADARG); - - if((res = mp_copy(a, b)) != MP_OKAY) - return res; - - SIGN(b) = MP_ZPOS; - - return MP_OKAY; - -} /* end mp_abs() */ - -/* }}} */ - -/* {{{ mp_neg(a, b) */ - -/* - mp_neg(a, b) - - Compute b = -a. 'a' and 'b' may be identical. - */ - -mp_err mp_neg(mp_int *a, mp_int *b) -{ - mp_err res; - - ARGCHK(a != NULL && b != NULL, MP_BADARG); - - if((res = mp_copy(a, b)) != MP_OKAY) - return res; - - if(s_mp_cmp_d(b, 0) == MP_EQ) - SIGN(b) = MP_ZPOS; - else - SIGN(b) = (SIGN(b) == MP_NEG) ? MP_ZPOS : MP_NEG; - - return MP_OKAY; - -} /* end mp_neg() */ - -/* }}} */ - -/* {{{ mp_add(a, b, c) */ - -/* - mp_add(a, b, c) - - Compute c = a + b. All parameters may be identical. - */ - -mp_err mp_add(mp_int *a, mp_int *b, mp_int *c) -{ - mp_err res; - int cmp; - - ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); - - if(SIGN(a) == SIGN(b)) { /* same sign: add values, keep sign */ - - /* Commutativity of addition lets us do this in either order, - so we avoid having to use a temporary even if the result - is supposed to replace the output - */ - if(c == b) { - if((res = s_mp_add(c, a)) != MP_OKAY) - return res; - } else { - if(c != a && (res = mp_copy(a, c)) != MP_OKAY) - return res; - - if((res = s_mp_add(c, b)) != MP_OKAY) - return res; - } - - } else if((cmp = s_mp_cmp(a, b)) > 0) { /* different sign: a > b */ - - /* If the output is going to be clobbered, we will use a temporary - variable; otherwise, we'll do it without touching the memory - allocator at all, if possible - */ - if(c == b) { - mp_int tmp; - - if((res = mp_init_copy(&tmp, a)) != MP_OKAY) - return res; - if((res = s_mp_sub(&tmp, b)) != MP_OKAY) { - mp_clear(&tmp); - return res; - } - - s_mp_exch(&tmp, c); - mp_clear(&tmp); - - } else { - - if(c != a && (res = mp_copy(a, c)) != MP_OKAY) - return res; - if((res = s_mp_sub(c, b)) != MP_OKAY) - return res; - - } - - } else if(cmp == 0) { /* different sign, a == b */ - - mp_zero(c); - return MP_OKAY; - - } else { /* different sign: a < b */ - - /* See above... */ - if(c == a) { - mp_int tmp; - - if((res = mp_init_copy(&tmp, b)) != MP_OKAY) - return res; - if((res = s_mp_sub(&tmp, a)) != MP_OKAY) { - mp_clear(&tmp); - return res; - } - - s_mp_exch(&tmp, c); - mp_clear(&tmp); - - } else { - - if(c != b && (res = mp_copy(b, c)) != MP_OKAY) - return res; - if((res = s_mp_sub(c, a)) != MP_OKAY) - return res; - - } - } - - if(USED(c) == 1 && DIGIT(c, 0) == 0) - SIGN(c) = MP_ZPOS; - - return MP_OKAY; - -} /* end mp_add() */ - -/* }}} */ - -/* {{{ mp_sub(a, b, c) */ - -/* - mp_sub(a, b, c) - - Compute c = a - b. All parameters may be identical. - */ - -mp_err mp_sub(mp_int *a, mp_int *b, mp_int *c) -{ - mp_err res; - int cmp; - - ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); - - if(SIGN(a) != SIGN(b)) { - if(c == a) { - if((res = s_mp_add(c, b)) != MP_OKAY) - return res; - } else { - if(c != b && ((res = mp_copy(b, c)) != MP_OKAY)) - return res; - if((res = s_mp_add(c, a)) != MP_OKAY) - return res; - SIGN(c) = SIGN(a); - } - - } else if((cmp = s_mp_cmp(a, b)) > 0) { /* Same sign, a > b */ - if(c == b) { - mp_int tmp; - - if((res = mp_init_copy(&tmp, a)) != MP_OKAY) - return res; - if((res = s_mp_sub(&tmp, b)) != MP_OKAY) { - mp_clear(&tmp); - return res; - } - s_mp_exch(&tmp, c); - mp_clear(&tmp); - - } else { - if(c != a && ((res = mp_copy(a, c)) != MP_OKAY)) - return res; - - if((res = s_mp_sub(c, b)) != MP_OKAY) - return res; - } - - } else if(cmp == 0) { /* Same sign, equal magnitude */ - mp_zero(c); - return MP_OKAY; - - } else { /* Same sign, b > a */ - if(c == a) { - mp_int tmp; - - if((res = mp_init_copy(&tmp, b)) != MP_OKAY) - return res; - - if((res = s_mp_sub(&tmp, a)) != MP_OKAY) { - mp_clear(&tmp); - return res; - } - s_mp_exch(&tmp, c); - mp_clear(&tmp); - - } else { - if(c != b && ((res = mp_copy(b, c)) != MP_OKAY)) - return res; - - if((res = s_mp_sub(c, a)) != MP_OKAY) - return res; - } - - SIGN(c) = !SIGN(b); - } - - if(USED(c) == 1 && DIGIT(c, 0) == 0) - SIGN(c) = MP_ZPOS; - - return MP_OKAY; - -} /* end mp_sub() */ - -/* }}} */ - -/* {{{ mp_mul(a, b, c) */ - -/* - mp_mul(a, b, c) - - Compute c = a * b. All parameters may be identical. - */ - -mp_err mp_mul(mp_int *a, mp_int *b, mp_int *c) -{ - mp_err res; - mp_sign sgn; - - ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); - - sgn = (SIGN(a) == SIGN(b)) ? MP_ZPOS : MP_NEG; - - if(c == b) { - if((res = s_mp_mul(c, a)) != MP_OKAY) - return res; - - } else { - if((res = mp_copy(a, c)) != MP_OKAY) - return res; - - if((res = s_mp_mul(c, b)) != MP_OKAY) - return res; - } - - if(sgn == MP_ZPOS || s_mp_cmp_d(c, 0) == MP_EQ) - SIGN(c) = MP_ZPOS; - else - SIGN(c) = sgn; - - return MP_OKAY; - -} /* end mp_mul() */ - -/* }}} */ - -/* {{{ mp_mul_2d(a, d, c) */ - -/* - mp_mul_2d(a, d, c) - - Compute c = a * 2^d. a may be the same as c. - */ - -mp_err mp_mul_2d(mp_int *a, mp_digit d, mp_int *c) -{ - mp_err res; - - ARGCHK(a != NULL && c != NULL, MP_BADARG); - - if((res = mp_copy(a, c)) != MP_OKAY) - return res; - - if(d == 0) - return MP_OKAY; - - return s_mp_mul_2d(c, d); - -} /* end mp_mul() */ - -/* }}} */ - -/* {{{ mp_sqr(a, b) */ - -#if MP_SQUARE -mp_err mp_sqr(mp_int *a, mp_int *b) -{ - mp_err res; - - ARGCHK(a != NULL && b != NULL, MP_BADARG); - - if((res = mp_copy(a, b)) != MP_OKAY) - return res; - - if((res = s_mp_sqr(b)) != MP_OKAY) - return res; - - SIGN(b) = MP_ZPOS; - - return MP_OKAY; - -} /* end mp_sqr() */ -#endif - -/* }}} */ - -/* {{{ mp_div(a, b, q, r) */ - -/* - mp_div(a, b, q, r) - - Compute q = a / b and r = a mod b. Input parameters may be re-used - as output parameters. If q or r is NULL, that portion of the - computation will be discarded (although it will still be computed) - - Pay no attention to the hacker behind the curtain. - */ - -mp_err mp_div(mp_int *a, mp_int *b, mp_int *q, mp_int *r) -{ - mp_err res; - mp_int qtmp, rtmp; - int cmp; - - ARGCHK(a != NULL && b != NULL, MP_BADARG); - - if(mp_cmp_z(b) == MP_EQ) - return MP_RANGE; - - /* If a <= b, we can compute the solution without division, and - avoid any memory allocation - */ - if((cmp = s_mp_cmp(a, b)) < 0) { - if(r) { - if((res = mp_copy(a, r)) != MP_OKAY) - return res; - } - - if(q) - mp_zero(q); - - return MP_OKAY; - - } else if(cmp == 0) { - - /* Set quotient to 1, with appropriate sign */ - if(q) { - int qneg = (SIGN(a) != SIGN(b)); - - mp_set(q, 1); - if(qneg) - SIGN(q) = MP_NEG; - } - - if(r) - mp_zero(r); - - return MP_OKAY; - } - - /* If we get here, it means we actually have to do some division */ - - /* Set up some temporaries... */ - if((res = mp_init_copy(&qtmp, a)) != MP_OKAY) - return res; - if((res = mp_init_copy(&rtmp, b)) != MP_OKAY) - goto CLEANUP; - - if((res = s_mp_div(&qtmp, &rtmp)) != MP_OKAY) - goto CLEANUP; - - /* Compute the signs for the output */ - SIGN(&rtmp) = SIGN(a); /* Sr = Sa */ - if(SIGN(a) == SIGN(b)) - SIGN(&qtmp) = MP_ZPOS; /* Sq = MP_ZPOS if Sa = Sb */ - else - SIGN(&qtmp) = MP_NEG; /* Sq = MP_NEG if Sa != Sb */ - - if(s_mp_cmp_d(&qtmp, 0) == MP_EQ) - SIGN(&qtmp) = MP_ZPOS; - if(s_mp_cmp_d(&rtmp, 0) == MP_EQ) - SIGN(&rtmp) = MP_ZPOS; - - /* Copy output, if it is needed */ - if(q) - s_mp_exch(&qtmp, q); - - if(r) - s_mp_exch(&rtmp, r); - -CLEANUP: - mp_clear(&rtmp); - mp_clear(&qtmp); - - return res; - -} /* end mp_div() */ - -/* }}} */ - -/* {{{ mp_div_2d(a, d, q, r) */ - -mp_err mp_div_2d(mp_int *a, mp_digit d, mp_int *q, mp_int *r) -{ - mp_err res; - - ARGCHK(a != NULL, MP_BADARG); - - if(q) { - if((res = mp_copy(a, q)) != MP_OKAY) - return res; - - s_mp_div_2d(q, d); - } - - if(r) { - if((res = mp_copy(a, r)) != MP_OKAY) - return res; - - s_mp_mod_2d(r, d); - } - - return MP_OKAY; - -} /* end mp_div_2d() */ - -/* }}} */ - -/* {{{ mp_expt(a, b, c) */ - -/* - mp_expt(a, b, c) - - Compute c = a ** b, that is, raise a to the b power. Uses a - standard iterative square-and-multiply technique. - */ - -mp_err mp_expt(mp_int *a, mp_int *b, mp_int *c) -{ - mp_int s, x; - mp_err res; - mp_digit d; - int dig, bit; - - ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); - - if(mp_cmp_z(b) < 0) - return MP_RANGE; - - if((res = mp_init(&s)) != MP_OKAY) - return res; - - mp_set(&s, 1); - - if((res = mp_init_copy(&x, a)) != MP_OKAY) - goto X; - - /* Loop over low-order digits in ascending order */ - for(dig = 0; dig < (USED(b) - 1); dig++) { - d = DIGIT(b, dig); - - /* Loop over bits of each non-maximal digit */ - for(bit = 0; bit < DIGIT_BIT; bit++) { - if(d & 1) { - if((res = s_mp_mul(&s, &x)) != MP_OKAY) - goto CLEANUP; - } - - d >>= 1; - - if((res = s_mp_sqr(&x)) != MP_OKAY) - goto CLEANUP; - } - } - - /* Consider now the last digit... */ - d = DIGIT(b, dig); - - while(d) { - if(d & 1) { - if((res = s_mp_mul(&s, &x)) != MP_OKAY) - goto CLEANUP; - } - - d >>= 1; - - if((res = s_mp_sqr(&x)) != MP_OKAY) - goto CLEANUP; - } - - if(mp_iseven(b)) - SIGN(&s) = SIGN(a); - - res = mp_copy(&s, c); - -CLEANUP: - mp_clear(&x); -X: - mp_clear(&s); - - return res; - -} /* end mp_expt() */ - -/* }}} */ - -/* {{{ mp_2expt(a, k) */ - -/* Compute a = 2^k */ - -mp_err mp_2expt(mp_int *a, mp_digit k) -{ - ARGCHK(a != NULL, MP_BADARG); - - return s_mp_2expt(a, k); - -} /* end mp_2expt() */ - -/* }}} */ - -/* {{{ mp_mod(a, m, c) */ - -/* - mp_mod(a, m, c) - - Compute c = a (mod m). Result will always be 0 <= c < m. - */ - -mp_err mp_mod(mp_int *a, mp_int *m, mp_int *c) -{ - mp_err res; - int mag; - - ARGCHK(a != NULL && m != NULL && c != NULL, MP_BADARG); - - if(SIGN(m) == MP_NEG) - return MP_RANGE; - - /* - If |a| > m, we need to divide to get the remainder and take the - absolute value. - - If |a| < m, we don't need to do any division, just copy and adjust - the sign (if a is negative). - - If |a| == m, we can simply set the result to zero. - - This order is intended to minimize the average path length of the - comparison chain on common workloads -- the most frequent cases are - that |a| != m, so we do those first. - */ - if((mag = s_mp_cmp(a, m)) > 0) { - if((res = mp_div(a, m, NULL, c)) != MP_OKAY) - return res; - - if(SIGN(c) == MP_NEG) { - if((res = mp_add(c, m, c)) != MP_OKAY) - return res; - } - - } else if(mag < 0) { - if((res = mp_copy(a, c)) != MP_OKAY) - return res; - - if(mp_cmp_z(a) < 0) { - if((res = mp_add(c, m, c)) != MP_OKAY) - return res; - - } - - } else { - mp_zero(c); - - } - - return MP_OKAY; - -} /* end mp_mod() */ - -/* }}} */ - -/* {{{ mp_mod_d(a, d, c) */ - -/* - mp_mod_d(a, d, c) - - Compute c = a (mod d). Result will always be 0 <= c < d - */ -mp_err mp_mod_d(mp_int *a, mp_digit d, mp_digit *c) -{ - mp_err res; - mp_digit rem; - - ARGCHK(a != NULL && c != NULL, MP_BADARG); - - if(s_mp_cmp_d(a, d) > 0) { - if((res = mp_div_d(a, d, NULL, &rem)) != MP_OKAY) - return res; - - } else { - if(SIGN(a) == MP_NEG) - rem = d - DIGIT(a, 0); - else - rem = DIGIT(a, 0); - } - - if(c) - *c = rem; - - return MP_OKAY; - -} /* end mp_mod_d() */ - -/* }}} */ - -/* {{{ mp_sqrt(a, b) */ - -/* - mp_sqrt(a, b) - - Compute the integer square root of a, and store the result in b. - Uses an integer-arithmetic version of Newton's iterative linear - approximation technique to determine this value; the result has the - following two properties: - - b^2 <= a - (b+1)^2 >= a - - It is a range error to pass a negative value. - */ -mp_err mp_sqrt(mp_int *a, mp_int *b) -{ - mp_int x, t; - mp_err res; - - ARGCHK(a != NULL && b != NULL, MP_BADARG); - - /* Cannot take square root of a negative value */ - if(SIGN(a) == MP_NEG) - return MP_RANGE; - - /* Special cases for zero and one, trivial */ - if(mp_cmp_d(a, 0) == MP_EQ || mp_cmp_d(a, 1) == MP_EQ) - return mp_copy(a, b); - - /* Initialize the temporaries we'll use below */ - if((res = mp_init_size(&t, USED(a))) != MP_OKAY) - return res; - - /* Compute an initial guess for the iteration as a itself */ - if((res = mp_init_copy(&x, a)) != MP_OKAY) - goto X; - -s_mp_rshd(&x, (USED(&x)/2)+1); -mp_add_d(&x, 1, &x); - - for(;;) { - /* t = (x * x) - a */ - mp_copy(&x, &t); /* can't fail, t is big enough for original x */ - if((res = mp_sqr(&t, &t)) != MP_OKAY || - (res = mp_sub(&t, a, &t)) != MP_OKAY) - goto CLEANUP; - - /* t = t / 2x */ - s_mp_mul_2(&x); - if((res = mp_div(&t, &x, &t, NULL)) != MP_OKAY) - goto CLEANUP; - s_mp_div_2(&x); - - /* Terminate the loop, if the quotient is zero */ - if(mp_cmp_z(&t) == MP_EQ) - break; - - /* x = x - t */ - if((res = mp_sub(&x, &t, &x)) != MP_OKAY) - goto CLEANUP; - - } - - /* Copy result to output parameter */ - mp_sub_d(&x, 1, &x); - s_mp_exch(&x, b); - - CLEANUP: - mp_clear(&x); - X: - mp_clear(&t); - - return res; - -} /* end mp_sqrt() */ - -/* }}} */ - -/* }}} */ - -/*------------------------------------------------------------------------*/ -/* {{{ Modular arithmetic */ - -#if MP_MODARITH -/* {{{ mp_addmod(a, b, m, c) */ - -/* - mp_addmod(a, b, m, c) - - Compute c = (a + b) mod m - */ - -mp_err mp_addmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) -{ - mp_err res; - - ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG); - - if((res = mp_add(a, b, c)) != MP_OKAY) - return res; - if((res = mp_mod(c, m, c)) != MP_OKAY) - return res; - - return MP_OKAY; - -} - -/* }}} */ - -/* {{{ mp_submod(a, b, m, c) */ - -/* - mp_submod(a, b, m, c) - - Compute c = (a - b) mod m - */ - -mp_err mp_submod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) -{ - mp_err res; - - ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG); - - if((res = mp_sub(a, b, c)) != MP_OKAY) - return res; - if((res = mp_mod(c, m, c)) != MP_OKAY) - return res; - - return MP_OKAY; - -} - -/* }}} */ - -/* {{{ mp_mulmod(a, b, m, c) */ - -/* - mp_mulmod(a, b, m, c) - - Compute c = (a * b) mod m - */ - -mp_err mp_mulmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) -{ - mp_err res; - - ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG); - - if((res = mp_mul(a, b, c)) != MP_OKAY) - return res; - if((res = mp_mod(c, m, c)) != MP_OKAY) - return res; - - return MP_OKAY; - -} - -/* }}} */ - -/* {{{ mp_sqrmod(a, m, c) */ - -#if MP_SQUARE -mp_err mp_sqrmod(mp_int *a, mp_int *m, mp_int *c) -{ - mp_err res; - - ARGCHK(a != NULL && m != NULL && c != NULL, MP_BADARG); - - if((res = mp_sqr(a, c)) != MP_OKAY) - return res; - if((res = mp_mod(c, m, c)) != MP_OKAY) - return res; - - return MP_OKAY; - -} /* end mp_sqrmod() */ -#endif - -/* }}} */ - -/* {{{ mp_exptmod(a, b, m, c) */ - -/* - mp_exptmod(a, b, m, c) - - Compute c = (a ** b) mod m. Uses a standard square-and-multiply - method with modular reductions at each step. (This is basically the - same code as mp_expt(), except for the addition of the reductions) - - The modular reductions are done using Barrett's algorithm (see - s_mp_reduce() below for details) - */ - -mp_err mp_exptmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) -{ - mp_int s, x, mu; - mp_err res; - mp_digit d, *db = DIGITS(b); - mp_size ub = USED(b); - int dig, bit; - - ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); - - if(mp_cmp_z(b) < 0 || mp_cmp_z(m) <= 0) - return MP_RANGE; - - if((res = mp_init(&s)) != MP_OKAY) - return res; - if((res = mp_init_copy(&x, a)) != MP_OKAY) - goto X; - if((res = mp_mod(&x, m, &x)) != MP_OKAY || - (res = mp_init(&mu)) != MP_OKAY) - goto MU; - - mp_set(&s, 1); - - /* mu = b^2k / m */ - s_mp_add_d(&mu, 1); - s_mp_lshd(&mu, 2 * USED(m)); - if((res = mp_div(&mu, m, &mu, NULL)) != MP_OKAY) - goto CLEANUP; - - /* Loop over digits of b in ascending order, except highest order */ - for(dig = 0; dig < (ub - 1); dig++) { - d = *db++; - - /* Loop over the bits of the lower-order digits */ - for(bit = 0; bit < DIGIT_BIT; bit++) { - if(d & 1) { - if((res = s_mp_mul(&s, &x)) != MP_OKAY) - goto CLEANUP; - if((res = s_mp_reduce(&s, m, &mu)) != MP_OKAY) - goto CLEANUP; - } - - d >>= 1; - - if((res = s_mp_sqr(&x)) != MP_OKAY) - goto CLEANUP; - if((res = s_mp_reduce(&x, m, &mu)) != MP_OKAY) - goto CLEANUP; - } - } - - /* Now do the last digit... */ - d = *db; - - while(d) { - if(d & 1) { - if((res = s_mp_mul(&s, &x)) != MP_OKAY) - goto CLEANUP; - if((res = s_mp_reduce(&s, m, &mu)) != MP_OKAY) - goto CLEANUP; - } - - d >>= 1; - - if((res = s_mp_sqr(&x)) != MP_OKAY) - goto CLEANUP; - if((res = s_mp_reduce(&x, m, &mu)) != MP_OKAY) - goto CLEANUP; - } - - s_mp_exch(&s, c); - - CLEANUP: - mp_clear(&mu); - MU: - mp_clear(&x); - X: - mp_clear(&s); - - return res; - -} /* end mp_exptmod() */ - -/* }}} */ - -/* {{{ mp_exptmod_d(a, d, m, c) */ - -mp_err mp_exptmod_d(mp_int *a, mp_digit d, mp_int *m, mp_int *c) -{ - mp_int s, x; - mp_err res; - - ARGCHK(a != NULL && c != NULL, MP_BADARG); - - if((res = mp_init(&s)) != MP_OKAY) - return res; - if((res = mp_init_copy(&x, a)) != MP_OKAY) - goto X; - - mp_set(&s, 1); - - while(d != 0) { - if(d & 1) { - if((res = s_mp_mul(&s, &x)) != MP_OKAY || - (res = mp_mod(&s, m, &s)) != MP_OKAY) - goto CLEANUP; - } - - d /= 2; - - if((res = s_mp_sqr(&x)) != MP_OKAY || - (res = mp_mod(&x, m, &x)) != MP_OKAY) - goto CLEANUP; - } - - s_mp_exch(&s, c); - -CLEANUP: - mp_clear(&x); -X: - mp_clear(&s); - - return res; - -} /* end mp_exptmod_d() */ - -/* }}} */ -#endif /* if MP_MODARITH */ - -/* }}} */ - -/*------------------------------------------------------------------------*/ -/* {{{ Comparison functions */ - -/* {{{ mp_cmp_z(a) */ - -/* - mp_cmp_z(a) - - Compare a <=> 0. Returns <0 if a<0, 0 if a=0, >0 if a>0. - */ - -int mp_cmp_z(mp_int *a) -{ - if(SIGN(a) == MP_NEG) - return MP_LT; - else if(USED(a) == 1 && DIGIT(a, 0) == 0) - return MP_EQ; - else - return MP_GT; - -} /* end mp_cmp_z() */ - -/* }}} */ - -/* {{{ mp_cmp_d(a, d) */ - -/* - mp_cmp_d(a, d) - - Compare a <=> d. Returns <0 if a0 if a>d - */ - -int mp_cmp_d(mp_int *a, mp_digit d) -{ - ARGCHK(a != NULL, MP_EQ); - - if(SIGN(a) == MP_NEG) - return MP_LT; - - return s_mp_cmp_d(a, d); - -} /* end mp_cmp_d() */ - -/* }}} */ - -/* {{{ mp_cmp(a, b) */ - -int mp_cmp(mp_int *a, mp_int *b) -{ - ARGCHK(a != NULL && b != NULL, MP_EQ); - - if(SIGN(a) == SIGN(b)) { - int mag; - - if((mag = s_mp_cmp(a, b)) == MP_EQ) - return MP_EQ; - - if(SIGN(a) == MP_ZPOS) - return mag; - else - return -mag; - - } else if(SIGN(a) == MP_ZPOS) { - return MP_GT; - } else { - return MP_LT; - } - -} /* end mp_cmp() */ - -/* }}} */ - -/* {{{ mp_cmp_mag(a, b) */ - -/* - mp_cmp_mag(a, b) - - Compares |a| <=> |b|, and returns an appropriate comparison result - */ - -int mp_cmp_mag(mp_int *a, mp_int *b) -{ - ARGCHK(a != NULL && b != NULL, MP_EQ); - - return s_mp_cmp(a, b); - -} /* end mp_cmp_mag() */ - -/* }}} */ - -/* {{{ mp_cmp_int(a, z) */ - -/* - This just converts z to an mp_int, and uses the existing comparison - routines. This is sort of inefficient, but it's not clear to me how - frequently this wil get used anyway. For small positive constants, - you can always use mp_cmp_d(), and for zero, there is mp_cmp_z(). - */ -int mp_cmp_int(mp_int *a, long z) -{ - mp_int tmp; - int out; - - ARGCHK(a != NULL, MP_EQ); - - mp_init(&tmp); mp_set_int(&tmp, z); - out = mp_cmp(a, &tmp); - mp_clear(&tmp); - - return out; - -} /* end mp_cmp_int() */ - -/* }}} */ - -/* {{{ mp_isodd(a) */ - -/* - mp_isodd(a) - - Returns a true (non-zero) value if a is odd, false (zero) otherwise. - */ -int mp_isodd(mp_int *a) -{ - ARGCHK(a != NULL, 0); - - return (DIGIT(a, 0) & 1); - -} /* end mp_isodd() */ - -/* }}} */ - -/* {{{ mp_iseven(a) */ - -int mp_iseven(mp_int *a) -{ - return !mp_isodd(a); - -} /* end mp_iseven() */ - -/* }}} */ - -/* }}} */ - -/*------------------------------------------------------------------------*/ -/* {{{ Number theoretic functions */ - -#if MP_NUMTH -/* {{{ mp_gcd(a, b, c) */ - -/* - Like the old mp_gcd() function, except computes the GCD using the - binary algorithm due to Josef Stein in 1961 (via Knuth). - */ -mp_err mp_gcd(mp_int *a, mp_int *b, mp_int *c) -{ - mp_err res; - mp_int u, v, t; - mp_size k = 0; - - ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); - - if(mp_cmp_z(a) == MP_EQ && mp_cmp_z(b) == MP_EQ) - return MP_RANGE; - if(mp_cmp_z(a) == MP_EQ) { - return mp_copy(b, c); - } else if(mp_cmp_z(b) == MP_EQ) { - return mp_copy(a, c); - } - - if((res = mp_init(&t)) != MP_OKAY) - return res; - if((res = mp_init_copy(&u, a)) != MP_OKAY) - goto U; - if((res = mp_init_copy(&v, b)) != MP_OKAY) - goto V; - - SIGN(&u) = MP_ZPOS; - SIGN(&v) = MP_ZPOS; - - /* Divide out common factors of 2 until at least 1 of a, b is even */ - while(mp_iseven(&u) && mp_iseven(&v)) { - s_mp_div_2(&u); - s_mp_div_2(&v); - ++k; - } - - /* Initialize t */ - if(mp_isodd(&u)) { - if((res = mp_copy(&v, &t)) != MP_OKAY) - goto CLEANUP; - - /* t = -v */ - if(SIGN(&v) == MP_ZPOS) - SIGN(&t) = MP_NEG; - else - SIGN(&t) = MP_ZPOS; - - } else { - if((res = mp_copy(&u, &t)) != MP_OKAY) - goto CLEANUP; - - } - - for(;;) { - while(mp_iseven(&t)) { - s_mp_div_2(&t); - } - - if(mp_cmp_z(&t) == MP_GT) { - if((res = mp_copy(&t, &u)) != MP_OKAY) - goto CLEANUP; - - } else { - if((res = mp_copy(&t, &v)) != MP_OKAY) - goto CLEANUP; - - /* v = -t */ - if(SIGN(&t) == MP_ZPOS) - SIGN(&v) = MP_NEG; - else - SIGN(&v) = MP_ZPOS; - } - - if((res = mp_sub(&u, &v, &t)) != MP_OKAY) - goto CLEANUP; - - if(s_mp_cmp_d(&t, 0) == MP_EQ) - break; - } - - s_mp_2expt(&v, k); /* v = 2^k */ - res = mp_mul(&u, &v, c); /* c = u * v */ - - CLEANUP: - mp_clear(&v); - V: - mp_clear(&u); - U: - mp_clear(&t); - - return res; - -} /* end mp_bgcd() */ - -/* }}} */ - -/* {{{ mp_lcm(a, b, c) */ - -/* We compute the least common multiple using the rule: - - ab = [a, b](a, b) - - ... by computing the product, and dividing out the gcd. - */ - -mp_err mp_lcm(mp_int *a, mp_int *b, mp_int *c) -{ - mp_int gcd, prod; - mp_err res; - - ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); - - /* Set up temporaries */ - if((res = mp_init(&gcd)) != MP_OKAY) - return res; - if((res = mp_init(&prod)) != MP_OKAY) - goto GCD; - - if((res = mp_mul(a, b, &prod)) != MP_OKAY) - goto CLEANUP; - if((res = mp_gcd(a, b, &gcd)) != MP_OKAY) - goto CLEANUP; - - res = mp_div(&prod, &gcd, c, NULL); - - CLEANUP: - mp_clear(&prod); - GCD: - mp_clear(&gcd); - - return res; - -} /* end mp_lcm() */ - -/* }}} */ - -/* {{{ mp_xgcd(a, b, g, x, y) */ - -/* - mp_xgcd(a, b, g, x, y) - - Compute g = (a, b) and values x and y satisfying Bezout's identity - (that is, ax + by = g). This uses the extended binary GCD algorithm - based on the Stein algorithm used for mp_gcd() - */ - -mp_err mp_xgcd(mp_int *a, mp_int *b, mp_int *g, mp_int *x, mp_int *y) -{ - mp_int gx, xc, yc, u, v, A, B, C, D; - mp_int *clean[9]; - mp_err res; - int last = -1; - - if(mp_cmp_z(b) == 0) - return MP_RANGE; - - /* Initialize all these variables we need */ - if((res = mp_init(&u)) != MP_OKAY) goto CLEANUP; - clean[++last] = &u; - if((res = mp_init(&v)) != MP_OKAY) goto CLEANUP; - clean[++last] = &v; - if((res = mp_init(&gx)) != MP_OKAY) goto CLEANUP; - clean[++last] = &gx; - if((res = mp_init(&A)) != MP_OKAY) goto CLEANUP; - clean[++last] = &A; - if((res = mp_init(&B)) != MP_OKAY) goto CLEANUP; - clean[++last] = &B; - if((res = mp_init(&C)) != MP_OKAY) goto CLEANUP; - clean[++last] = &C; - if((res = mp_init(&D)) != MP_OKAY) goto CLEANUP; - clean[++last] = &D; - if((res = mp_init_copy(&xc, a)) != MP_OKAY) goto CLEANUP; - clean[++last] = &xc; - mp_abs(&xc, &xc); - if((res = mp_init_copy(&yc, b)) != MP_OKAY) goto CLEANUP; - clean[++last] = &yc; - mp_abs(&yc, &yc); - - mp_set(&gx, 1); - - /* Divide by two until at least one of them is even */ - while(mp_iseven(&xc) && mp_iseven(&yc)) { - s_mp_div_2(&xc); - s_mp_div_2(&yc); - if((res = s_mp_mul_2(&gx)) != MP_OKAY) - goto CLEANUP; - } - - mp_copy(&xc, &u); - mp_copy(&yc, &v); - mp_set(&A, 1); mp_set(&D, 1); - - /* Loop through binary GCD algorithm */ - for(;;) { - while(mp_iseven(&u)) { - s_mp_div_2(&u); - - if(mp_iseven(&A) && mp_iseven(&B)) { - s_mp_div_2(&A); s_mp_div_2(&B); - } else { - if((res = mp_add(&A, &yc, &A)) != MP_OKAY) goto CLEANUP; - s_mp_div_2(&A); - if((res = mp_sub(&B, &xc, &B)) != MP_OKAY) goto CLEANUP; - s_mp_div_2(&B); - } - } - - while(mp_iseven(&v)) { - s_mp_div_2(&v); - - if(mp_iseven(&C) && mp_iseven(&D)) { - s_mp_div_2(&C); s_mp_div_2(&D); - } else { - if((res = mp_add(&C, &yc, &C)) != MP_OKAY) goto CLEANUP; - s_mp_div_2(&C); - if((res = mp_sub(&D, &xc, &D)) != MP_OKAY) goto CLEANUP; - s_mp_div_2(&D); - } - } - - if(mp_cmp(&u, &v) >= 0) { - if((res = mp_sub(&u, &v, &u)) != MP_OKAY) goto CLEANUP; - if((res = mp_sub(&A, &C, &A)) != MP_OKAY) goto CLEANUP; - if((res = mp_sub(&B, &D, &B)) != MP_OKAY) goto CLEANUP; - - } else { - if((res = mp_sub(&v, &u, &v)) != MP_OKAY) goto CLEANUP; - if((res = mp_sub(&C, &A, &C)) != MP_OKAY) goto CLEANUP; - if((res = mp_sub(&D, &B, &D)) != MP_OKAY) goto CLEANUP; - - } - - /* If we're done, copy results to output */ - if(mp_cmp_z(&u) == 0) { - if(x) - if((res = mp_copy(&C, x)) != MP_OKAY) goto CLEANUP; - - if(y) - if((res = mp_copy(&D, y)) != MP_OKAY) goto CLEANUP; - - if(g) - if((res = mp_mul(&gx, &v, g)) != MP_OKAY) goto CLEANUP; - - break; - } - } - - CLEANUP: - while(last >= 0) - mp_clear(clean[last--]); - - return res; - -} /* end mp_xgcd() */ - -/* }}} */ - -/* {{{ mp_invmod(a, m, c) */ - -/* - mp_invmod(a, m, c) - - Compute c = a^-1 (mod m), if there is an inverse for a (mod m). - This is equivalent to the question of whether (a, m) = 1. If not, - MP_UNDEF is returned, and there is no inverse. - */ - -mp_err mp_invmod(mp_int *a, mp_int *m, mp_int *c) -{ - mp_int g, x; - mp_err res; - - ARGCHK(a && m && c, MP_BADARG); - - if(mp_cmp_z(a) == 0 || mp_cmp_z(m) == 0) - return MP_RANGE; - - if((res = mp_init(&g)) != MP_OKAY) - return res; - if((res = mp_init(&x)) != MP_OKAY) - goto X; - - if((res = mp_xgcd(a, m, &g, &x, NULL)) != MP_OKAY) - goto CLEANUP; - - if(mp_cmp_d(&g, 1) != MP_EQ) { - res = MP_UNDEF; - goto CLEANUP; - } - - res = mp_mod(&x, m, c); - SIGN(c) = SIGN(a); - -CLEANUP: - mp_clear(&x); -X: - mp_clear(&g); - - return res; - -} /* end mp_invmod() */ - -/* }}} */ -#endif /* if MP_NUMTH */ - -/* }}} */ - -/*------------------------------------------------------------------------*/ -/* {{{ mp_print(mp, ofp) */ - -#if MP_IOFUNC -/* - mp_print(mp, ofp) - - Print a textual representation of the given mp_int on the output - stream 'ofp'. Output is generated using the internal radix. - */ - -void mp_print(mp_int *mp, FILE *ofp) -{ - int ix; - - if(mp == NULL || ofp == NULL) - return; - - fputc((SIGN(mp) == MP_NEG) ? '-' : '+', ofp); - - for(ix = USED(mp) - 1; ix >= 0; ix--) { - fprintf(ofp, DIGIT_FMT, DIGIT(mp, ix)); - } - -} /* end mp_print() */ - -#endif /* if MP_IOFUNC */ - -/* }}} */ - -/*------------------------------------------------------------------------*/ -/* {{{ More I/O Functions */ - -/* {{{ mp_read_signed_bin(mp, str, len) */ - -/* - mp_read_signed_bin(mp, str, len) - - Read in a raw value (base 256) into the given mp_int - */ - -mp_err mp_read_signed_bin(mp_int *mp, unsigned char *str, int len) -{ - mp_err res; - - ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG); - - if((res = mp_read_unsigned_bin(mp, str + 1, len - 1)) == MP_OKAY) { - /* Get sign from first byte */ - if(str[0]) - SIGN(mp) = MP_NEG; - else - SIGN(mp) = MP_ZPOS; - } - - return res; - -} /* end mp_read_signed_bin() */ - -/* }}} */ - -/* {{{ mp_signed_bin_size(mp) */ - -int mp_signed_bin_size(mp_int *mp) -{ - ARGCHK(mp != NULL, 0); - - return mp_unsigned_bin_size(mp) + 1; - -} /* end mp_signed_bin_size() */ - -/* }}} */ - -/* {{{ mp_to_signed_bin(mp, str) */ - -mp_err mp_to_signed_bin(mp_int *mp, unsigned char *str) -{ - ARGCHK(mp != NULL && str != NULL, MP_BADARG); - - /* Caller responsible for allocating enough memory (use mp_raw_size(mp)) */ - str[0] = (char)SIGN(mp); - - return mp_to_unsigned_bin(mp, str + 1); - -} /* end mp_to_signed_bin() */ - -/* }}} */ - -/* {{{ mp_read_unsigned_bin(mp, str, len) */ - -/* - mp_read_unsigned_bin(mp, str, len) - - Read in an unsigned value (base 256) into the given mp_int - */ - -mp_err mp_read_unsigned_bin(mp_int *mp, unsigned char *str, int len) -{ - int ix; - mp_err res; - - ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG); - - mp_zero(mp); - - for(ix = 0; ix < len; ix++) { - if((res = s_mp_mul_2d(mp, CHAR_BIT)) != MP_OKAY) - return res; - - if((res = mp_add_d(mp, str[ix], mp)) != MP_OKAY) - return res; - } - - return MP_OKAY; - -} /* end mp_read_unsigned_bin() */ - -/* }}} */ - -/* {{{ mp_unsigned_bin_size(mp) */ - -int mp_unsigned_bin_size(mp_int *mp) -{ - mp_digit topdig; - int count; - - ARGCHK(mp != NULL, 0); - - /* Special case for the value zero */ - if(USED(mp) == 1 && DIGIT(mp, 0) == 0) - return 1; - - count = (USED(mp) - 1) * sizeof(mp_digit); - topdig = DIGIT(mp, USED(mp) - 1); - - while(topdig != 0) { - ++count; - topdig >>= CHAR_BIT; - } - - return count; - -} /* end mp_unsigned_bin_size() */ - -/* }}} */ - -/* {{{ mp_to_unsigned_bin(mp, str) */ - -mp_err mp_to_unsigned_bin(mp_int *mp, unsigned char *str) -{ - mp_digit *dp, *end, d; - unsigned char *spos; - - ARGCHK(mp != NULL && str != NULL, MP_BADARG); - - dp = DIGITS(mp); - end = dp + USED(mp) - 1; - spos = str; - - /* Special case for zero, quick test */ - if(dp == end && *dp == 0) { - *str = '\0'; - return MP_OKAY; - } - - /* Generate digits in reverse order */ - while(dp < end) { - int ix; - - d = *dp; - for(ix = 0; ix < sizeof(mp_digit); ++ix) { - *spos = d & UCHAR_MAX; - d >>= CHAR_BIT; - ++spos; - } - - ++dp; - } - - /* Now handle last digit specially, high order zeroes are not written */ - d = *end; - while(d != 0) { - *spos = d & UCHAR_MAX; - d >>= CHAR_BIT; - ++spos; - } - - /* Reverse everything to get digits in the correct order */ - while(--spos > str) { - unsigned char t = *str; - *str = *spos; - *spos = t; - - ++str; - } - - return MP_OKAY; - -} /* end mp_to_unsigned_bin() */ - -/* }}} */ - -/* {{{ mp_count_bits(mp) */ - -int mp_count_bits(mp_int *mp) -{ - int len; - mp_digit d; - - ARGCHK(mp != NULL, MP_BADARG); - - len = DIGIT_BIT * (USED(mp) - 1); - d = DIGIT(mp, USED(mp) - 1); - - while(d != 0) { - ++len; - d >>= 1; - } - - return len; - -} /* end mp_count_bits() */ - -/* }}} */ - -/* {{{ mp_read_radix(mp, str, radix) */ - -/* - mp_read_radix(mp, str, radix) - - Read an integer from the given string, and set mp to the resulting - value. The input is presumed to be in base 10. Leading non-digit - characters are ignored, and the function reads until a non-digit - character or the end of the string. - */ - -mp_err mp_read_radix(mp_int *mp, unsigned char *str, int radix) -{ - int ix = 0, val = 0; - mp_err res; - mp_sign sig = MP_ZPOS; - - ARGCHK(mp != NULL && str != NULL && radix >= 2 && radix <= MAX_RADIX, - MP_BADARG); - - mp_zero(mp); - - /* Skip leading non-digit characters until a digit or '-' or '+' */ - while(str[ix] && - (s_mp_tovalue(str[ix], radix) < 0) && - str[ix] != '-' && - str[ix] != '+') { - ++ix; - } - - if(str[ix] == '-') { - sig = MP_NEG; - ++ix; - } else if(str[ix] == '+') { - sig = MP_ZPOS; /* this is the default anyway... */ - ++ix; - } - - while((val = s_mp_tovalue(str[ix], radix)) >= 0) { - if((res = s_mp_mul_d(mp, radix)) != MP_OKAY) - return res; - if((res = s_mp_add_d(mp, val)) != MP_OKAY) - return res; - ++ix; - } - - if(s_mp_cmp_d(mp, 0) == MP_EQ) - SIGN(mp) = MP_ZPOS; - else - SIGN(mp) = sig; - - return MP_OKAY; - -} /* end mp_read_radix() */ - -/* }}} */ - -/* {{{ mp_radix_size(mp, radix) */ - -int mp_radix_size(mp_int *mp, int radix) -{ - int len; - ARGCHK(mp != NULL, 0); - - len = s_mp_outlen(mp_count_bits(mp), radix) + 1; /* for NUL terminator */ - - if(mp_cmp_z(mp) < 0) - ++len; /* for sign */ - - return len; - -} /* end mp_radix_size() */ - -/* }}} */ - -/* {{{ mp_value_radix_size(num, qty, radix) */ - -/* num = number of digits - qty = number of bits per digit - radix = target base - - Return the number of digits in the specified radix that would be - needed to express 'num' digits of 'qty' bits each. - */ -int mp_value_radix_size(int num, int qty, int radix) -{ - ARGCHK(num >= 0 && qty > 0 && radix >= 2 && radix <= MAX_RADIX, 0); - - return s_mp_outlen(num * qty, radix); - -} /* end mp_value_radix_size() */ - -/* }}} */ - -/* {{{ mp_toradix(mp, str, radix) */ - -mp_err mp_toradix(mp_int *mp, unsigned char *str, int radix) -{ - int ix, pos = 0; - - ARGCHK(mp != NULL && str != NULL, MP_BADARG); - ARGCHK(radix > 1 && radix <= MAX_RADIX, MP_RANGE); - - if(mp_cmp_z(mp) == MP_EQ) { - str[0] = '0'; - str[1] = '\0'; - } else { - mp_err res; - mp_int tmp; - mp_sign sgn; - mp_digit rem, rdx = (mp_digit)radix; - char ch; - - if((res = mp_init_copy(&tmp, mp)) != MP_OKAY) - return res; - - /* Save sign for later, and take absolute value */ - sgn = SIGN(&tmp); SIGN(&tmp) = MP_ZPOS; - - /* Generate output digits in reverse order */ - while(mp_cmp_z(&tmp) != 0) { - if((res = s_mp_div_d(&tmp, rdx, &rem)) != MP_OKAY) { - mp_clear(&tmp); - return res; - } - - /* Generate digits, use capital letters */ - ch = s_mp_todigit(rem, radix, 0); - - str[pos++] = ch; - } - - /* Add - sign if original value was negative */ - if(sgn == MP_NEG) - str[pos++] = '-'; - - /* Add trailing NUL to end the string */ - str[pos--] = '\0'; - - /* Reverse the digits and sign indicator */ - ix = 0; - while(ix < pos) { - char tmp = str[ix]; - - str[ix] = str[pos]; - str[pos] = tmp; - ++ix; - --pos; - } - - mp_clear(&tmp); - } - - return MP_OKAY; - -} /* end mp_toradix() */ - -/* }}} */ - -/* {{{ mp_char2value(ch, r) */ - -int mp_char2value(char ch, int r) -{ - return s_mp_tovalue(ch, r); - -} /* end mp_tovalue() */ - -/* }}} */ - -/* }}} */ - -/* {{{ mp_strerror(ec) */ - -/* - mp_strerror(ec) - - Return a string describing the meaning of error code 'ec'. The - string returned is allocated in static memory, so the caller should - not attempt to modify or free the memory associated with this - string. - */ -const char *mp_strerror(mp_err ec) -{ - int aec = (ec < 0) ? -ec : ec; - - /* Code values are negative, so the senses of these comparisons - are accurate */ - if(ec < MP_LAST_CODE || ec > MP_OKAY) { - return mp_err_string[0]; /* unknown error code */ - } else { - return mp_err_string[aec + 1]; - } - -} /* end mp_strerror() */ - -/* }}} */ - -/*========================================================================*/ -/*------------------------------------------------------------------------*/ -/* Static function definitions (internal use only) */ - -/* {{{ Memory management */ - -/* {{{ s_mp_grow(mp, min) */ - -/* Make sure there are at least 'min' digits allocated to mp */ -mp_err s_mp_grow(mp_int *mp, mp_size min) -{ - if(min > ALLOC(mp)) { - mp_digit *tmp; - - /* Set min to next nearest default precision block size */ - min = ((min + (s_mp_defprec - 1)) / s_mp_defprec) * s_mp_defprec; - - if((tmp = s_mp_alloc(min, sizeof(mp_digit))) == NULL) - return MP_MEM; - - s_mp_copy(DIGITS(mp), tmp, USED(mp)); - -#if MP_CRYPTO - s_mp_setz(DIGITS(mp), ALLOC(mp)); -#endif - s_mp_free(DIGITS(mp)); - DIGITS(mp) = tmp; - ALLOC(mp) = min; - } - - return MP_OKAY; - -} /* end s_mp_grow() */ - -/* }}} */ - -/* {{{ s_mp_pad(mp, min) */ - -/* Make sure the used size of mp is at least 'min', growing if needed */ -mp_err s_mp_pad(mp_int *mp, mp_size min) -{ - if(min > USED(mp)) { - mp_err res; - - /* Make sure there is room to increase precision */ - if(min > ALLOC(mp) && (res = s_mp_grow(mp, min)) != MP_OKAY) - return res; - - /* Increase precision; should already be 0-filled */ - USED(mp) = min; - } - - return MP_OKAY; - -} /* end s_mp_pad() */ - -/* }}} */ - -/* {{{ s_mp_setz(dp, count) */ - -#if MP_MACRO == 0 -/* Set 'count' digits pointed to by dp to be zeroes */ -void s_mp_setz(mp_digit *dp, mp_size count) -{ -#if MP_MEMSET == 0 - int ix; - - for(ix = 0; ix < count; ix++) - dp[ix] = 0; -#else - memset(dp, 0, count * sizeof(mp_digit)); -#endif - -} /* end s_mp_setz() */ -#endif - -/* }}} */ - -/* {{{ s_mp_copy(sp, dp, count) */ - -#if MP_MACRO == 0 -/* Copy 'count' digits from sp to dp */ -void s_mp_copy(mp_digit *sp, mp_digit *dp, mp_size count) -{ -#if MP_MEMCPY == 0 - int ix; - - for(ix = 0; ix < count; ix++) - dp[ix] = sp[ix]; -#else - memcpy(dp, sp, count * sizeof(mp_digit)); -#endif - -} /* end s_mp_copy() */ -#endif - -/* }}} */ - -/* {{{ s_mp_alloc(nb, ni) */ - -#if MP_MACRO == 0 -/* Allocate ni records of nb bytes each, and return a pointer to that */ -void *s_mp_alloc(size_t nb, size_t ni) -{ - return calloc(nb, ni); - -} /* end s_mp_alloc() */ -#endif - -/* }}} */ - -/* {{{ s_mp_free(ptr) */ - -#if MP_MACRO == 0 -/* Free the memory pointed to by ptr */ -void s_mp_free(void *ptr) -{ - if(ptr) - free(ptr); - -} /* end s_mp_free() */ -#endif - -/* }}} */ - -/* {{{ s_mp_clamp(mp) */ - -/* Remove leading zeroes from the given value */ -void s_mp_clamp(mp_int *mp) -{ - mp_size du = USED(mp); - mp_digit *zp = DIGITS(mp) + du - 1; - - while(du > 1 && !*zp--) - --du; - - USED(mp) = du; - -} /* end s_mp_clamp() */ - - -/* }}} */ - -/* {{{ s_mp_exch(a, b) */ - -/* Exchange the data for a and b; (b, a) = (a, b) */ -void s_mp_exch(mp_int *a, mp_int *b) -{ - mp_int tmp; - - tmp = *a; - *a = *b; - *b = tmp; - -} /* end s_mp_exch() */ - -/* }}} */ - -/* }}} */ - -/* {{{ Arithmetic helpers */ - -/* {{{ s_mp_lshd(mp, p) */ - -/* - Shift mp leftward by p digits, growing if needed, and zero-filling - the in-shifted digits at the right end. This is a convenient - alternative to multiplication by powers of the radix - */ - -mp_err s_mp_lshd(mp_int *mp, mp_size p) -{ - mp_err res; - mp_size pos; - mp_digit *dp; - int ix; - - if(p == 0) - return MP_OKAY; - - if((res = s_mp_pad(mp, USED(mp) + p)) != MP_OKAY) - return res; - - pos = USED(mp) - 1; - dp = DIGITS(mp); - - /* Shift all the significant figures over as needed */ - for(ix = pos - p; ix >= 0; ix--) - dp[ix + p] = dp[ix]; - - /* Fill the bottom digits with zeroes */ - for(ix = 0; ix < p; ix++) - dp[ix] = 0; - - return MP_OKAY; - -} /* end s_mp_lshd() */ - -/* }}} */ - -/* {{{ s_mp_rshd(mp, p) */ - -/* - Shift mp rightward by p digits. Maintains the invariant that - digits above the precision are all zero. Digits shifted off the - end are lost. Cannot fail. - */ - -void s_mp_rshd(mp_int *mp, mp_size p) -{ - mp_size ix; - mp_digit *dp; - - if(p == 0) - return; - - /* Shortcut when all digits are to be shifted off */ - if(p >= USED(mp)) { - s_mp_setz(DIGITS(mp), ALLOC(mp)); - USED(mp) = 1; - SIGN(mp) = MP_ZPOS; - return; - } - - /* Shift all the significant figures over as needed */ - dp = DIGITS(mp); - for(ix = p; ix < USED(mp); ix++) - dp[ix - p] = dp[ix]; - - /* Fill the top digits with zeroes */ - ix -= p; - while(ix < USED(mp)) - dp[ix++] = 0; - - /* Strip off any leading zeroes */ - s_mp_clamp(mp); - -} /* end s_mp_rshd() */ - -/* }}} */ - -/* {{{ s_mp_div_2(mp) */ - -/* Divide by two -- take advantage of radix properties to do it fast */ -void s_mp_div_2(mp_int *mp) -{ - s_mp_div_2d(mp, 1); - -} /* end s_mp_div_2() */ - -/* }}} */ - -/* {{{ s_mp_mul_2(mp) */ - -mp_err s_mp_mul_2(mp_int *mp) -{ - int ix; - mp_digit kin = 0, kout, *dp = DIGITS(mp); - mp_err res; - - /* Shift digits leftward by 1 bit */ - for(ix = 0; ix < USED(mp); ix++) { - kout = (dp[ix] >> (DIGIT_BIT - 1)) & 1; - dp[ix] = (dp[ix] << 1) | kin; - - kin = kout; - } - - /* Deal with rollover from last digit */ - if(kin) { - if(ix >= ALLOC(mp)) { - if((res = s_mp_grow(mp, ALLOC(mp) + 1)) != MP_OKAY) - return res; - dp = DIGITS(mp); - } - - dp[ix] = kin; - USED(mp) += 1; - } - - return MP_OKAY; - -} /* end s_mp_mul_2() */ - -/* }}} */ - -/* {{{ s_mp_mod_2d(mp, d) */ - -/* - Remainder the integer by 2^d, where d is a number of bits. This - amounts to a bitwise AND of the value, and does not require the full - division code - */ -void s_mp_mod_2d(mp_int *mp, mp_digit d) -{ - unsigned int ndig = (d / DIGIT_BIT), nbit = (d % DIGIT_BIT); - unsigned int ix; - mp_digit dmask, *dp = DIGITS(mp); - - if(ndig >= USED(mp)) - return; - - /* Flush all the bits above 2^d in its digit */ - dmask = (1 << nbit) - 1; - dp[ndig] &= dmask; - - /* Flush all digits above the one with 2^d in it */ - for(ix = ndig + 1; ix < USED(mp); ix++) - dp[ix] = 0; - - s_mp_clamp(mp); - -} /* end s_mp_mod_2d() */ - -/* }}} */ - -/* {{{ s_mp_mul_2d(mp, d) */ - -/* - Multiply by the integer 2^d, where d is a number of bits. This - amounts to a bitwise shift of the value, and does not require the - full multiplication code. - */ -mp_err s_mp_mul_2d(mp_int *mp, mp_digit d) -{ - mp_err res; - mp_digit save, next, mask, *dp; - mp_size used; - int ix; - - if((res = s_mp_lshd(mp, d / DIGIT_BIT)) != MP_OKAY) - return res; - - dp = DIGITS(mp); used = USED(mp); - d %= DIGIT_BIT; - - mask = (1 << d) - 1; - - /* If the shift requires another digit, make sure we've got one to - work with */ - if((dp[used - 1] >> (DIGIT_BIT - d)) & mask) { - if((res = s_mp_grow(mp, used + 1)) != MP_OKAY) - return res; - dp = DIGITS(mp); - } - - /* Do the shifting... */ - save = 0; - for(ix = 0; ix < used; ix++) { - next = (dp[ix] >> (DIGIT_BIT - d)) & mask; - dp[ix] = (dp[ix] << d) | save; - save = next; - } - - /* If, at this point, we have a nonzero carryout into the next - digit, we'll increase the size by one digit, and store it... - */ - if(save) { - dp[used] = save; - USED(mp) += 1; - } - - s_mp_clamp(mp); - return MP_OKAY; - -} /* end s_mp_mul_2d() */ - -/* }}} */ - -/* {{{ s_mp_div_2d(mp, d) */ - -/* - Divide the integer by 2^d, where d is a number of bits. This - amounts to a bitwise shift of the value, and does not require the - full division code (used in Barrett reduction, see below) - */ -void s_mp_div_2d(mp_int *mp, mp_digit d) -{ - int ix; - mp_digit save, next, mask, *dp = DIGITS(mp); - - s_mp_rshd(mp, d / DIGIT_BIT); - d %= DIGIT_BIT; - - mask = (1 << d) - 1; - - save = 0; - for(ix = USED(mp) - 1; ix >= 0; ix--) { - next = dp[ix] & mask; - dp[ix] = (dp[ix] >> d) | (save << (DIGIT_BIT - d)); - save = next; - } - - s_mp_clamp(mp); - -} /* end s_mp_div_2d() */ - -/* }}} */ - -/* {{{ s_mp_norm(a, b) */ - -/* - s_mp_norm(a, b) - - Normalize a and b for division, where b is the divisor. In order - that we might make good guesses for quotient digits, we want the - leading digit of b to be at least half the radix, which we - accomplish by multiplying a and b by a constant. This constant is - returned (so that it can be divided back out of the remainder at the - end of the division process). - - We multiply by the smallest power of 2 that gives us a leading digit - at least half the radix. By choosing a power of 2, we simplify the - multiplication and division steps to simple shifts. - */ -mp_digit s_mp_norm(mp_int *a, mp_int *b) -{ - mp_digit t, d = 0; - - t = DIGIT(b, USED(b) - 1); - while(t < (RADIX / 2)) { - t <<= 1; - ++d; - } - - if(d != 0) { - s_mp_mul_2d(a, d); - s_mp_mul_2d(b, d); - } - - return d; - -} /* end s_mp_norm() */ - -/* }}} */ - -/* }}} */ - -/* {{{ Primitive digit arithmetic */ - -/* {{{ s_mp_add_d(mp, d) */ - -/* Add d to |mp| in place */ -mp_err s_mp_add_d(mp_int *mp, mp_digit d) /* unsigned digit addition */ -{ - mp_word w, k = 0; - mp_size ix = 1, used = USED(mp); - mp_digit *dp = DIGITS(mp); - - w = dp[0] + d; - dp[0] = ACCUM(w); - k = CARRYOUT(w); - - while(ix < used && k) { - w = dp[ix] + k; - dp[ix] = ACCUM(w); - k = CARRYOUT(w); - ++ix; - } - - if(k != 0) { - mp_err res; - - if((res = s_mp_pad(mp, USED(mp) + 1)) != MP_OKAY) - return res; - - DIGIT(mp, ix) = k; - } - - return MP_OKAY; - -} /* end s_mp_add_d() */ - -/* }}} */ - -/* {{{ s_mp_sub_d(mp, d) */ - -/* Subtract d from |mp| in place, assumes |mp| > d */ -mp_err s_mp_sub_d(mp_int *mp, mp_digit d) /* unsigned digit subtract */ -{ - mp_word w, b = 0; - mp_size ix = 1, used = USED(mp); - mp_digit *dp = DIGITS(mp); - - /* Compute initial subtraction */ - w = (RADIX + dp[0]) - d; - b = CARRYOUT(w) ? 0 : 1; - dp[0] = ACCUM(w); - - /* Propagate borrows leftward */ - while(b && ix < used) { - w = (RADIX + dp[ix]) - b; - b = CARRYOUT(w) ? 0 : 1; - dp[ix] = ACCUM(w); - ++ix; - } - - /* Remove leading zeroes */ - s_mp_clamp(mp); - - /* If we have a borrow out, it's a violation of the input invariant */ - if(b) - return MP_RANGE; - else - return MP_OKAY; - -} /* end s_mp_sub_d() */ - -/* }}} */ - -/* {{{ s_mp_mul_d(a, d) */ - -/* Compute a = a * d, single digit multiplication */ -mp_err s_mp_mul_d(mp_int *a, mp_digit d) -{ - mp_word w, k = 0; - mp_size ix, max; - mp_err res; - mp_digit *dp = DIGITS(a); - - /* - Single-digit multiplication will increase the precision of the - output by at most one digit. However, we can detect when this - will happen -- if the high-order digit of a, times d, gives a - two-digit result, then the precision of the result will increase; - otherwise it won't. We use this fact to avoid calling s_mp_pad() - unless absolutely necessary. - */ - max = USED(a); - w = dp[max - 1] * d; - if(CARRYOUT(w) != 0) { - if((res = s_mp_pad(a, max + 1)) != MP_OKAY) - return res; - dp = DIGITS(a); - } - - for(ix = 0; ix < max; ix++) { - w = (dp[ix] * d) + k; - dp[ix] = ACCUM(w); - k = CARRYOUT(w); - } - - /* If there is a precision increase, take care of it here; the above - test guarantees we have enough storage to do this safely. - */ - if(k) { - dp[max] = k; - USED(a) = max + 1; - } - - s_mp_clamp(a); - - return MP_OKAY; - -} /* end s_mp_mul_d() */ - -/* }}} */ - -/* {{{ s_mp_div_d(mp, d, r) */ - -/* - s_mp_div_d(mp, d, r) - - Compute the quotient mp = mp / d and remainder r = mp mod d, for a - single digit d. If r is null, the remainder will be discarded. - */ - -mp_err s_mp_div_d(mp_int *mp, mp_digit d, mp_digit *r) -{ - mp_word w = 0, t; - mp_int quot; - mp_err res; - mp_digit *dp = DIGITS(mp), *qp; - int ix; - - if(d == 0) - return MP_RANGE; - - /* Make room for the quotient */ - if((res = mp_init_size(", USED(mp))) != MP_OKAY) - return res; - - USED(") = USED(mp); /* so clamping will work below */ - qp = DIGITS("); - - /* Divide without subtraction */ - for(ix = USED(mp) - 1; ix >= 0; ix--) { - w = (w << DIGIT_BIT) | dp[ix]; - - if(w >= d) { - t = w / d; - w = w % d; - } else { - t = 0; - } - - qp[ix] = t; - } - - /* Deliver the remainder, if desired */ - if(r) - *r = w; - - s_mp_clamp("); - mp_exch(", mp); - mp_clear("); - - return MP_OKAY; - -} /* end s_mp_div_d() */ - -/* }}} */ - -/* }}} */ - -/* {{{ Primitive full arithmetic */ - -/* {{{ s_mp_add(a, b) */ - -/* Compute a = |a| + |b| */ -mp_err s_mp_add(mp_int *a, mp_int *b) /* magnitude addition */ -{ - mp_word w = 0; - mp_digit *pa, *pb; - mp_size ix, used = USED(b); - mp_err res; - - /* Make sure a has enough precision for the output value */ - if((used > USED(a)) && (res = s_mp_pad(a, used)) != MP_OKAY) - return res; - - /* - Add up all digits up to the precision of b. If b had initially - the same precision as a, or greater, we took care of it by the - padding step above, so there is no problem. If b had initially - less precision, we'll have to make sure the carry out is duly - propagated upward among the higher-order digits of the sum. - */ - pa = DIGITS(a); - pb = DIGITS(b); - for(ix = 0; ix < used; ++ix) { - w += *pa + *pb++; - *pa++ = ACCUM(w); - w = CARRYOUT(w); - } - - /* If we run out of 'b' digits before we're actually done, make - sure the carries get propagated upward... - */ - used = USED(a); - while(w && ix < used) { - w += *pa; - *pa++ = ACCUM(w); - w = CARRYOUT(w); - ++ix; - } - - /* If there's an overall carry out, increase precision and include - it. We could have done this initially, but why touch the memory - allocator unless we're sure we have to? - */ - if(w) { - if((res = s_mp_pad(a, used + 1)) != MP_OKAY) - return res; - - DIGIT(a, ix) = w; /* pa may not be valid after s_mp_pad() call */ - } - - return MP_OKAY; - -} /* end s_mp_add() */ - -/* }}} */ - -/* {{{ s_mp_sub(a, b) */ - -/* Compute a = |a| - |b|, assumes |a| >= |b| */ -mp_err s_mp_sub(mp_int *a, mp_int *b) /* magnitude subtract */ -{ - mp_word w = 0; - mp_digit *pa, *pb; - mp_size ix, used = USED(b); - - /* - Subtract and propagate borrow. Up to the precision of b, this - accounts for the digits of b; after that, we just make sure the - carries get to the right place. This saves having to pad b out to - the precision of a just to make the loops work right... - */ - pa = DIGITS(a); - pb = DIGITS(b); - - for(ix = 0; ix < used; ++ix) { - w = (RADIX + *pa) - w - *pb++; - *pa++ = ACCUM(w); - w = CARRYOUT(w) ? 0 : 1; - } - - used = USED(a); - while(ix < used) { - w = RADIX + *pa - w; - *pa++ = ACCUM(w); - w = CARRYOUT(w) ? 0 : 1; - ++ix; - } - - /* Clobber any leading zeroes we created */ - s_mp_clamp(a); - - /* - If there was a borrow out, then |b| > |a| in violation - of our input invariant. We've already done the work, - but we'll at least complain about it... - */ - if(w) - return MP_RANGE; - else - return MP_OKAY; - -} /* end s_mp_sub() */ - -/* }}} */ - -mp_err s_mp_reduce(mp_int *x, mp_int *m, mp_int *mu) -{ - mp_int q; - mp_err res; - mp_size um = USED(m); - - if((res = mp_init_copy(&q, x)) != MP_OKAY) - return res; - - s_mp_rshd(&q, um - 1); /* q1 = x / b^(k-1) */ - s_mp_mul(&q, mu); /* q2 = q1 * mu */ - s_mp_rshd(&q, um + 1); /* q3 = q2 / b^(k+1) */ - - /* x = x mod b^(k+1), quick (no division) */ - s_mp_mod_2d(x, (mp_digit)(DIGIT_BIT * (um + 1))); - - /* q = q * m mod b^(k+1), quick (no division), uses the short multiplier */ -#ifndef SHRT_MUL - s_mp_mul(&q, m); - s_mp_mod_2d(&q, (mp_digit)(DIGIT_BIT * (um + 1))); -#else - s_mp_mul_dig(&q, m, um + 1); -#endif - - /* x = x - q */ - if((res = mp_sub(x, &q, x)) != MP_OKAY) - goto CLEANUP; - - /* If x < 0, add b^(k+1) to it */ - if(mp_cmp_z(x) < 0) { - mp_set(&q, 1); - if((res = s_mp_lshd(&q, um + 1)) != MP_OKAY) - goto CLEANUP; - if((res = mp_add(x, &q, x)) != MP_OKAY) - goto CLEANUP; - } - - /* Back off if it's too big */ - while(mp_cmp(x, m) >= 0) { - if((res = s_mp_sub(x, m)) != MP_OKAY) - break; - } - - CLEANUP: - mp_clear(&q); - - return res; - -} /* end s_mp_reduce() */ - - - -/* {{{ s_mp_mul(a, b) */ - -/* Compute a = |a| * |b| */ -mp_err s_mp_mul(mp_int *a, mp_int *b) -{ - mp_word w, k = 0; - mp_int tmp; - mp_err res; - mp_size ix, jx, ua = USED(a), ub = USED(b); - mp_digit *pa, *pb, *pt, *pbt; - - if((res = mp_init_size(&tmp, ua + ub)) != MP_OKAY) - return res; - - /* This has the effect of left-padding with zeroes... */ - USED(&tmp) = ua + ub; - - /* We're going to need the base value each iteration */ - pbt = DIGITS(&tmp); - - /* Outer loop: Digits of b */ - - pb = DIGITS(b); - for(ix = 0; ix < ub; ++ix, ++pb) { - if(*pb == 0) - continue; - - /* Inner product: Digits of a */ - pa = DIGITS(a); - for(jx = 0; jx < ua; ++jx, ++pa) { - pt = pbt + ix + jx; - w = *pb * *pa + k + *pt; - *pt = ACCUM(w); - k = CARRYOUT(w); - } - - pbt[ix + jx] = k; - k = 0; - } - - s_mp_clamp(&tmp); - s_mp_exch(&tmp, a); - - mp_clear(&tmp); - - return MP_OKAY; - -} /* end s_mp_mul() */ - -/* }}} */ - -/* {{{ s_mp_kmul(a, b, out, len) */ - -#if 0 -void s_mp_kmul(mp_digit *a, mp_digit *b, mp_digit *out, mp_size len) -{ - mp_word w, k = 0; - mp_size ix, jx; - mp_digit *pa, *pt; - - for(ix = 0; ix < len; ++ix, ++b) { - if(*b == 0) - continue; - - pa = a; - for(jx = 0; jx < len; ++jx, ++pa) { - pt = out + ix + jx; - w = *b * *pa + k + *pt; - *pt = ACCUM(w); - k = CARRYOUT(w); - } - - out[ix + jx] = k; - k = 0; - } - -} /* end s_mp_kmul() */ -#endif - -/* }}} */ - -/* {{{ s_mp_sqr(a) */ - -/* - Computes the square of a, in place. This can be done more - efficiently than a general multiplication, because many of the - computation steps are redundant when squaring. The inner product - step is a bit more complicated, but we save a fair number of - iterations of the multiplication loop. - */ -#if MP_SQUARE -mp_err s_mp_sqr(mp_int *a) -{ - mp_word w, k = 0; - mp_int tmp; - mp_err res; - mp_size ix, jx, kx, used = USED(a); - mp_digit *pa1, *pa2, *pt, *pbt; - - if((res = mp_init_size(&tmp, 2 * used)) != MP_OKAY) - return res; - - /* Left-pad with zeroes */ - USED(&tmp) = 2 * used; - - /* We need the base value each time through the loop */ - pbt = DIGITS(&tmp); - - pa1 = DIGITS(a); - for(ix = 0; ix < used; ++ix, ++pa1) { - if(*pa1 == 0) - continue; - - w = DIGIT(&tmp, ix + ix) + (*pa1 * *pa1); - - pbt[ix + ix] = ACCUM(w); - k = CARRYOUT(w); - - /* - The inner product is computed as: - - (C, S) = t[i,j] + 2 a[i] a[j] + C - - This can overflow what can be represented in an mp_word, and - since C arithmetic does not provide any way to check for - overflow, we have to check explicitly for overflow conditions - before they happen. - */ - for(jx = ix + 1, pa2 = DIGITS(a) + jx; jx < used; ++jx, ++pa2) { - mp_word u = 0, v; - - /* Store this in a temporary to avoid indirections later */ - pt = pbt + ix + jx; - - /* Compute the multiplicative step */ - w = *pa1 * *pa2; - - /* If w is more than half MP_WORD_MAX, the doubling will - overflow, and we need to record a carry out into the next - word */ - u = (w >> (MP_WORD_BIT - 1)) & 1; - - /* Double what we've got, overflow will be ignored as defined - for C arithmetic (we've already noted if it is to occur) - */ - w *= 2; - - /* Compute the additive step */ - v = *pt + k; - - /* If we do not already have an overflow carry, check to see - if the addition will cause one, and set the carry out if so - */ - u |= ((MP_WORD_MAX - v) < w); - - /* Add in the rest, again ignoring overflow */ - w += v; - - /* Set the i,j digit of the output */ - *pt = ACCUM(w); - - /* Save carry information for the next iteration of the loop. - This is why k must be an mp_word, instead of an mp_digit */ - k = CARRYOUT(w) | (u << DIGIT_BIT); - - } /* for(jx ...) */ - - /* Set the last digit in the cycle and reset the carry */ - k = DIGIT(&tmp, ix + jx) + k; - pbt[ix + jx] = ACCUM(k); - k = CARRYOUT(k); - - /* If we are carrying out, propagate the carry to the next digit - in the output. This may cascade, so we have to be somewhat - circumspect -- but we will have enough precision in the output - that we won't overflow - */ - kx = 1; - while(k) { - k = pbt[ix + jx + kx] + 1; - pbt[ix + jx + kx] = ACCUM(k); - k = CARRYOUT(k); - ++kx; - } - } /* for(ix ...) */ - - s_mp_clamp(&tmp); - s_mp_exch(&tmp, a); - - mp_clear(&tmp); - - return MP_OKAY; - -} /* end s_mp_sqr() */ -#endif - -/* }}} */ - -/* {{{ s_mp_div(a, b) */ - -/* - s_mp_div(a, b) - - Compute a = a / b and b = a mod b. Assumes b > a. - */ - -mp_err s_mp_div(mp_int *a, mp_int *b) -{ - mp_int quot, rem, t; - mp_word q; - mp_err res; - mp_digit d; - int ix; - - if(mp_cmp_z(b) == 0) - return MP_RANGE; - - /* Shortcut if b is power of two */ - if((ix = s_mp_ispow2(b)) >= 0) { - mp_copy(a, b); /* need this for remainder */ - s_mp_div_2d(a, (mp_digit)ix); - s_mp_mod_2d(b, (mp_digit)ix); - - return MP_OKAY; - } - - /* Allocate space to store the quotient */ - if((res = mp_init_size(", USED(a))) != MP_OKAY) - return res; - - /* A working temporary for division */ - if((res = mp_init_size(&t, USED(a))) != MP_OKAY) - goto T; - - /* Allocate space for the remainder */ - if((res = mp_init_size(&rem, USED(a))) != MP_OKAY) - goto REM; - - /* Normalize to optimize guessing */ - d = s_mp_norm(a, b); - - /* Perform the division itself...woo! */ - ix = USED(a) - 1; - - while(ix >= 0) { - /* Find a partial substring of a which is at least b */ - while(s_mp_cmp(&rem, b) < 0 && ix >= 0) { - if((res = s_mp_lshd(&rem, 1)) != MP_OKAY) - goto CLEANUP; - - if((res = s_mp_lshd(", 1)) != MP_OKAY) - goto CLEANUP; - - DIGIT(&rem, 0) = DIGIT(a, ix); - s_mp_clamp(&rem); - --ix; - } - - /* If we didn't find one, we're finished dividing */ - if(s_mp_cmp(&rem, b) < 0) - break; - - /* Compute a guess for the next quotient digit */ - q = DIGIT(&rem, USED(&rem) - 1); - if(q <= DIGIT(b, USED(b) - 1) && USED(&rem) > 1) - q = (q << DIGIT_BIT) | DIGIT(&rem, USED(&rem) - 2); - - q /= DIGIT(b, USED(b) - 1); - - /* The guess can be as much as RADIX + 1 */ - if(q >= RADIX) - q = RADIX - 1; - - /* See what that multiplies out to */ - mp_copy(b, &t); - if((res = s_mp_mul_d(&t, q)) != MP_OKAY) - goto CLEANUP; - - /* - If it's too big, back it off. We should not have to do this - more than once, or, in rare cases, twice. Knuth describes a - method by which this could be reduced to a maximum of once, but - I didn't implement that here. - */ - while(s_mp_cmp(&t, &rem) > 0) { - --q; - s_mp_sub(&t, b); - } - - /* At this point, q should be the right next digit */ - if((res = s_mp_sub(&rem, &t)) != MP_OKAY) - goto CLEANUP; - - /* - Include the digit in the quotient. We allocated enough memory - for any quotient we could ever possibly get, so we should not - have to check for failures here - */ - DIGIT(", 0) = q; - } - - /* Denormalize remainder */ - if(d != 0) - s_mp_div_2d(&rem, d); - - s_mp_clamp("); - s_mp_clamp(&rem); - - /* Copy quotient back to output */ - s_mp_exch(", a); - - /* Copy remainder back to output */ - s_mp_exch(&rem, b); - -CLEANUP: - mp_clear(&rem); -REM: - mp_clear(&t); -T: - mp_clear("); - - return res; - -} /* end s_mp_div() */ - -/* }}} */ - -/* {{{ s_mp_2expt(a, k) */ - -mp_err s_mp_2expt(mp_int *a, mp_digit k) -{ - mp_err res; - mp_size dig, bit; - - dig = k / DIGIT_BIT; - bit = k % DIGIT_BIT; - - mp_zero(a); - if((res = s_mp_pad(a, dig + 1)) != MP_OKAY) - return res; - - DIGIT(a, dig) |= (1 << bit); - - return MP_OKAY; - -} /* end s_mp_2expt() */ - -/* }}} */ - - -/* }}} */ - -/* }}} */ - -/* {{{ Primitive comparisons */ - -/* {{{ s_mp_cmp(a, b) */ - -/* Compare |a| <=> |b|, return 0 if equal, <0 if a0 if a>b */ -int s_mp_cmp(mp_int *a, mp_int *b) -{ - mp_size ua = USED(a), ub = USED(b); - - if(ua > ub) - return MP_GT; - else if(ua < ub) - return MP_LT; - else { - int ix = ua - 1; - mp_digit *ap = DIGITS(a) + ix, *bp = DIGITS(b) + ix; - - while(ix >= 0) { - if(*ap > *bp) - return MP_GT; - else if(*ap < *bp) - return MP_LT; - - --ap; --bp; --ix; - } - - return MP_EQ; - } - -} /* end s_mp_cmp() */ - -/* }}} */ - -/* {{{ s_mp_cmp_d(a, d) */ - -/* Compare |a| <=> d, return 0 if equal, <0 if a0 if a>d */ -int s_mp_cmp_d(mp_int *a, mp_digit d) -{ - mp_size ua = USED(a); - mp_digit *ap = DIGITS(a); - - if(ua > 1) - return MP_GT; - - if(*ap < d) - return MP_LT; - else if(*ap > d) - return MP_GT; - else - return MP_EQ; - -} /* end s_mp_cmp_d() */ - -/* }}} */ - -/* {{{ s_mp_ispow2(v) */ - -/* - Returns -1 if the value is not a power of two; otherwise, it returns - k such that v = 2^k, i.e. lg(v). - */ -int s_mp_ispow2(mp_int *v) -{ - mp_digit d, *dp; - mp_size uv = USED(v); - int extra = 0, ix; - - d = DIGIT(v, uv - 1); /* most significant digit of v */ - - while(d && ((d & 1) == 0)) { - d >>= 1; - ++extra; - } - - if(d == 1) { - ix = uv - 2; - dp = DIGITS(v) + ix; - - while(ix >= 0) { - if(*dp) - return -1; /* not a power of two */ - - --dp; --ix; - } - - return ((uv - 1) * DIGIT_BIT) + extra; - } - - return -1; - -} /* end s_mp_ispow2() */ - -/* }}} */ - -/* {{{ s_mp_ispow2d(d) */ - -int s_mp_ispow2d(mp_digit d) -{ - int pow = 0; - - while((d & 1) == 0) { - ++pow; d >>= 1; - } - - if(d == 1) - return pow; - - return -1; - -} /* end s_mp_ispow2d() */ - -/* }}} */ - -/* }}} */ - -/* {{{ Primitive I/O helpers */ - -/* {{{ s_mp_tovalue(ch, r) */ - -/* - Convert the given character to its digit value, in the given radix. - If the given character is not understood in the given radix, -1 is - returned. Otherwise the digit's numeric value is returned. - - The results will be odd if you use a radix < 2 or > 62, you are - expected to know what you're up to. - */ -int s_mp_tovalue(char ch, int r) -{ - int val, xch; - - if(r > 36) - xch = ch; - else - xch = toupper(ch); - - if(isdigit(xch)) - val = xch - '0'; - else if(isupper(xch)) - val = xch - 'A' + 10; - else if(islower(xch)) - val = xch - 'a' + 36; - else if(xch == '+') - val = 62; - else if(xch == '/') - val = 63; - else - return -1; - - if(val < 0 || val >= r) - return -1; - - return val; - -} /* end s_mp_tovalue() */ - -/* }}} */ - -/* {{{ s_mp_todigit(val, r, low) */ - -/* - Convert val to a radix-r digit, if possible. If val is out of range - for r, returns zero. Otherwise, returns an ASCII character denoting - the value in the given radix. - - The results may be odd if you use a radix < 2 or > 64, you are - expected to know what you're doing. - */ - -char s_mp_todigit(int val, int r, int low) -{ - char ch; - - if(val < 0 || val >= r) - return 0; - - ch = s_dmap_1[val]; - - if(r <= 36 && low) - ch = tolower(ch); - - return ch; - -} /* end s_mp_todigit() */ - -/* }}} */ - -/* {{{ s_mp_outlen(bits, radix) */ - -/* - Return an estimate for how long a string is needed to hold a radix - r representation of a number with 'bits' significant bits. - - Does not include space for a sign or a NUL terminator. - */ -int s_mp_outlen(int bits, int r) -{ - return (int)((double)bits * LOG_V_2(r)); - -} /* end s_mp_outlen() */ - -/* }}} */ - -/* }}} */ - -/*------------------------------------------------------------------------*/ -/* HERE THERE BE DRAGONS */ -/* crc==4242132123, version==2, Sat Feb 02 06:43:52 2002 */ +/* + mpi.c + + by Michael J. Fromberger + Copyright (C) 1998 Michael J. Fromberger, All Rights Reserved + + Arbitrary precision integer arithmetic library + + $ID$ + */ + +#include "mpi.h" +#include +#include +#include + +#if MP_DEBUG +#include + +#define DIAG(T,V) {fprintf(stderr,T);mp_print(V,stderr);fputc('\n',stderr);} +#else +#define DIAG(T,V) +#endif + +/* + If MP_LOGTAB is not defined, use the math library to compute the + logarithms on the fly. Otherwise, use the static table below. + Pick which works best for your system. + */ +#if MP_LOGTAB + +/* {{{ s_logv_2[] - log table for 2 in various bases */ + +/* + A table of the logs of 2 for various bases (the 0 and 1 entries of + this table are meaningless and should not be referenced). + + This table is used to compute output lengths for the mp_toradix() + function. Since a number n in radix r takes up about log_r(n) + digits, we estimate the output size by taking the least integer + greater than log_r(n), where: + + log_r(n) = log_2(n) * log_r(2) + + This table, therefore, is a table of log_r(2) for 2 <= r <= 36, + which are the output bases supported. + */ + +#include "logtab.h" + +/* }}} */ +#define LOG_V_2(R) s_logv_2[(R)] + +#else + +#include +#define LOG_V_2(R) (log(2.0)/log(R)) + +#endif + +/* Default precision for newly created mp_int's */ +static unsigned int s_mp_defprec = MP_DEFPREC; + +/* {{{ Digit arithmetic macros */ + +/* + When adding and multiplying digits, the results can be larger than + can be contained in an mp_digit. Thus, an mp_word is used. These + macros mask off the upper and lower digits of the mp_word (the + mp_word may be more than 2 mp_digits wide, but we only concern + ourselves with the low-order 2 mp_digits) + + If your mp_word DOES have more than 2 mp_digits, you need to + uncomment the first line, and comment out the second. + */ + +/* #define CARRYOUT(W) (((W)>>DIGIT_BIT)&MP_DIGIT_MAX) */ +#define CARRYOUT(W) ((W)>>DIGIT_BIT) +#define ACCUM(W) ((W)&MP_DIGIT_MAX) + +/* }}} */ + +/* {{{ Comparison constants */ + +#define MP_LT -1 +#define MP_EQ 0 +#define MP_GT 1 + +/* }}} */ + +/* {{{ Constant strings */ + +/* Constant strings returned by mp_strerror() */ +static const char *mp_err_string[] = { + "unknown result code", /* say what? */ + "boolean true", /* MP_OKAY, MP_YES */ + "boolean false", /* MP_NO */ + "out of memory", /* MP_MEM */ + "argument out of range", /* MP_RANGE */ + "invalid input parameter", /* MP_BADARG */ + "result is undefined" /* MP_UNDEF */ +}; + +/* Value to digit maps for radix conversion */ + +/* s_dmap_1 - standard digits and letters */ +static const char *s_dmap_1 = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; + +#if 0 +/* s_dmap_2 - base64 ordering for digits */ +static const char *s_dmap_2 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +#endif + +/* }}} */ + +/* {{{ Static function declarations */ + +/* + If MP_MACRO is false, these will be defined as actual functions; + otherwise, suitable macro definitions will be used. This works + around the fact that ANSI C89 doesn't support an 'inline' keyword + (although I hear C9x will ... about bloody time). At present, the + macro definitions are identical to the function bodies, but they'll + expand in place, instead of generating a function call. + + I chose these particular functions to be made into macros because + some profiling showed they are called a lot on a typical workload, + and yet they are primarily housekeeping. + */ +#if MP_MACRO == 0 + void s_mp_setz(mp_digit *dp, mp_size count); /* zero digits */ + void s_mp_copy(mp_digit *sp, mp_digit *dp, mp_size count); /* copy */ + void *s_mp_alloc(size_t nb, size_t ni); /* general allocator */ + void s_mp_free(void *ptr); /* general free function */ +#else + + /* Even if these are defined as macros, we need to respect the settings + of the MP_MEMSET and MP_MEMCPY configuration options... + */ + #if MP_MEMSET == 0 + #define s_mp_setz(dp, count) \ + {int ix;for(ix=0;ix<(count);ix++)(dp)[ix]=0;} + #else + #define s_mp_setz(dp, count) memset(dp, 0, (count) * sizeof(mp_digit)) + #endif /* MP_MEMSET */ + + #if MP_MEMCPY == 0 + #define s_mp_copy(sp, dp, count) \ + {int ix;for(ix=0;ix<(count);ix++)(dp)[ix]=(sp)[ix];} + #else + #define s_mp_copy(sp, dp, count) memcpy(dp, sp, (count) * sizeof(mp_digit)) + #endif /* MP_MEMCPY */ + + #define s_mp_alloc(nb, ni) calloc(nb, ni) + #define s_mp_free(ptr) {if(ptr) free(ptr);} +#endif /* MP_MACRO */ + +mp_err s_mp_grow(mp_int *mp, mp_size min); /* increase allocated size */ +mp_err s_mp_pad(mp_int *mp, mp_size min); /* left pad with zeroes */ + +void s_mp_clamp(mp_int *mp); /* clip leading zeroes */ + +void s_mp_exch(mp_int *a, mp_int *b); /* swap a and b in place */ + +mp_err s_mp_lshd(mp_int *mp, mp_size p); /* left-shift by p digits */ +void s_mp_rshd(mp_int *mp, mp_size p); /* right-shift by p digits */ +void s_mp_div_2d(mp_int *mp, mp_digit d); /* divide by 2^d in place */ +void s_mp_mod_2d(mp_int *mp, mp_digit d); /* modulo 2^d in place */ +mp_err s_mp_mul_2d(mp_int *mp, mp_digit d); /* multiply by 2^d in place*/ +void s_mp_div_2(mp_int *mp); /* divide by 2 in place */ +mp_err s_mp_mul_2(mp_int *mp); /* multiply by 2 in place */ +mp_digit s_mp_norm(mp_int *a, mp_int *b); /* normalize for division */ +mp_err s_mp_add_d(mp_int *mp, mp_digit d); /* unsigned digit addition */ +mp_err s_mp_sub_d(mp_int *mp, mp_digit d); /* unsigned digit subtract */ +mp_err s_mp_mul_d(mp_int *mp, mp_digit d); /* unsigned digit multiply */ +mp_err s_mp_div_d(mp_int *mp, mp_digit d, mp_digit *r); + /* unsigned digit divide */ +mp_err s_mp_reduce(mp_int *x, mp_int *m, mp_int *mu); + /* Barrett reduction */ +mp_err s_mp_add(mp_int *a, mp_int *b); /* magnitude addition */ +mp_err s_mp_sub(mp_int *a, mp_int *b); /* magnitude subtract */ +mp_err s_mp_mul(mp_int *a, mp_int *b); /* magnitude multiply */ +#if 0 +void s_mp_kmul(mp_digit *a, mp_digit *b, mp_digit *out, mp_size len); + /* multiply buffers in place */ +#endif +#if MP_SQUARE +mp_err s_mp_sqr(mp_int *a); /* magnitude square */ +#else +#define s_mp_sqr(a) s_mp_mul(a, a) +#endif +mp_err s_mp_div(mp_int *a, mp_int *b); /* magnitude divide */ +mp_err s_mp_2expt(mp_int *a, mp_digit k); /* a = 2^k */ +int s_mp_cmp(mp_int *a, mp_int *b); /* magnitude comparison */ +int s_mp_cmp_d(mp_int *a, mp_digit d); /* magnitude digit compare */ +int s_mp_ispow2(mp_int *v); /* is v a power of 2? */ +int s_mp_ispow2d(mp_digit d); /* is d a power of 2? */ + +int s_mp_tovalue(char ch, int r); /* convert ch to value */ +char s_mp_todigit(int val, int r, int low); /* convert val to digit */ +int s_mp_outlen(int bits, int r); /* output length in bytes */ + +/* }}} */ + +/* {{{ Default precision manipulation */ + +unsigned int mp_get_prec(void) +{ + return s_mp_defprec; + +} /* end mp_get_prec() */ + +void mp_set_prec(unsigned int prec) +{ + if(prec == 0) + s_mp_defprec = MP_DEFPREC; + else + s_mp_defprec = prec; + +} /* end mp_set_prec() */ + +/* }}} */ + +/*------------------------------------------------------------------------*/ +/* {{{ mp_init(mp) */ + +/* + mp_init(mp) + + Initialize a new zero-valued mp_int. Returns MP_OKAY if successful, + MP_MEM if memory could not be allocated for the structure. + */ + +mp_err mp_init(mp_int *mp) +{ + return mp_init_size(mp, s_mp_defprec); + +} /* end mp_init() */ + +/* }}} */ + +/* {{{ mp_init_array(mp[], count) */ + +mp_err mp_init_array(mp_int mp[], int count) +{ + mp_err res; + int pos; + + ARGCHK(mp !=NULL && count > 0, MP_BADARG); + + for(pos = 0; pos < count; ++pos) { + if((res = mp_init(&mp[pos])) != MP_OKAY) + goto CLEANUP; + } + + return MP_OKAY; + + CLEANUP: + while(--pos >= 0) + mp_clear(&mp[pos]); + + return res; + +} /* end mp_init_array() */ + +/* }}} */ + +/* {{{ mp_init_size(mp, prec) */ + +/* + mp_init_size(mp, prec) + + Initialize a new zero-valued mp_int with at least the given + precision; returns MP_OKAY if successful, or MP_MEM if memory could + not be allocated for the structure. + */ + +mp_err mp_init_size(mp_int *mp, mp_size prec) +{ + ARGCHK(mp != NULL && prec > 0, MP_BADARG); + + if((DIGITS(mp) = s_mp_alloc(prec, sizeof(mp_digit))) == NULL) + return MP_MEM; + + SIGN(mp) = MP_ZPOS; + USED(mp) = 1; + ALLOC(mp) = prec; + + return MP_OKAY; + +} /* end mp_init_size() */ + +/* }}} */ + +/* {{{ mp_init_copy(mp, from) */ + +/* + mp_init_copy(mp, from) + + Initialize mp as an exact copy of from. Returns MP_OKAY if + successful, MP_MEM if memory could not be allocated for the new + structure. + */ + +mp_err mp_init_copy(mp_int *mp, mp_int *from) +{ + ARGCHK(mp != NULL && from != NULL, MP_BADARG); + + if(mp == from) + return MP_OKAY; + + if((DIGITS(mp) = s_mp_alloc(USED(from), sizeof(mp_digit))) == NULL) + return MP_MEM; + + s_mp_copy(DIGITS(from), DIGITS(mp), USED(from)); + USED(mp) = USED(from); + ALLOC(mp) = USED(from); + SIGN(mp) = SIGN(from); + + return MP_OKAY; + +} /* end mp_init_copy() */ + +/* }}} */ + +/* {{{ mp_copy(from, to) */ + +/* + mp_copy(from, to) + + Copies the mp_int 'from' to the mp_int 'to'. It is presumed that + 'to' has already been initialized (if not, use mp_init_copy() + instead). If 'from' and 'to' are identical, nothing happens. + */ + +mp_err mp_copy(mp_int *from, mp_int *to) +{ + ARGCHK(from != NULL && to != NULL, MP_BADARG); + + if(from == to) + return MP_OKAY; + + { /* copy */ + mp_digit *tmp; + + /* + If the allocated buffer in 'to' already has enough space to hold + all the used digits of 'from', we'll re-use it to avoid hitting + the memory allocater more than necessary; otherwise, we'd have + to grow anyway, so we just allocate a hunk and make the copy as + usual + */ + if(ALLOC(to) >= USED(from)) { + s_mp_setz(DIGITS(to) + USED(from), ALLOC(to) - USED(from)); + s_mp_copy(DIGITS(from), DIGITS(to), USED(from)); + + } else { + if((tmp = s_mp_alloc(USED(from), sizeof(mp_digit))) == NULL) + return MP_MEM; + + s_mp_copy(DIGITS(from), tmp, USED(from)); + + if(DIGITS(to) != NULL) { +#if MP_CRYPTO + s_mp_setz(DIGITS(to), ALLOC(to)); +#endif + s_mp_free(DIGITS(to)); + } + + DIGITS(to) = tmp; + ALLOC(to) = USED(from); + } + + /* Copy the precision and sign from the original */ + USED(to) = USED(from); + SIGN(to) = SIGN(from); + } /* end copy */ + + return MP_OKAY; + +} /* end mp_copy() */ + +/* }}} */ + +/* {{{ mp_exch(mp1, mp2) */ + +/* + mp_exch(mp1, mp2) + + Exchange mp1 and mp2 without allocating any intermediate memory + (well, unless you count the stack space needed for this call and the + locals it creates...). This cannot fail. + */ + +void mp_exch(mp_int *mp1, mp_int *mp2) +{ +#if MP_ARGCHK == 2 + assert(mp1 != NULL && mp2 != NULL); +#else + if(mp1 == NULL || mp2 == NULL) + return; +#endif + + s_mp_exch(mp1, mp2); + +} /* end mp_exch() */ + +/* }}} */ + +/* {{{ mp_clear(mp) */ + +/* + mp_clear(mp) + + Release the storage used by an mp_int, and void its fields so that + if someone calls mp_clear() again for the same int later, we won't + get tollchocked. + */ + +void mp_clear(mp_int *mp) +{ + if(mp == NULL) + return; + + if(DIGITS(mp) != NULL) { +#if MP_CRYPTO + s_mp_setz(DIGITS(mp), ALLOC(mp)); +#endif + s_mp_free(DIGITS(mp)); + DIGITS(mp) = NULL; + } + + USED(mp) = 0; + ALLOC(mp) = 0; + +} /* end mp_clear() */ + +/* }}} */ + +/* {{{ mp_clear_array(mp[], count) */ + +void mp_clear_array(mp_int mp[], int count) +{ + ARGCHK(mp != NULL && count > 0, MP_BADARG); + + while(--count >= 0) + mp_clear(&mp[count]); + +} /* end mp_clear_array() */ + +/* }}} */ + +/* {{{ mp_zero(mp) */ + +/* + mp_zero(mp) + + Set mp to zero. Does not change the allocated size of the structure, + and therefore cannot fail (except on a bad argument, which we ignore) + */ +void mp_zero(mp_int *mp) +{ + if(mp == NULL) + return; + + s_mp_setz(DIGITS(mp), ALLOC(mp)); + USED(mp) = 1; + SIGN(mp) = MP_ZPOS; + +} /* end mp_zero() */ + +/* }}} */ + +/* {{{ mp_set(mp, d) */ + +void mp_set(mp_int *mp, mp_digit d) +{ + if(mp == NULL) + return; + + mp_zero(mp); + DIGIT(mp, 0) = d; + +} /* end mp_set() */ + +/* }}} */ + +/* {{{ mp_set_int(mp, z) */ + +mp_err mp_set_int(mp_int *mp, long z) +{ + int ix; + unsigned long v = abs(z); + mp_err res; + + ARGCHK(mp != NULL, MP_BADARG); + + mp_zero(mp); + if(z == 0) + return MP_OKAY; /* shortcut for zero */ + + for(ix = sizeof(long) - 1; ix >= 0; ix--) { + + if((res = s_mp_mul_2d(mp, CHAR_BIT)) != MP_OKAY) + return res; + + res = s_mp_add_d(mp, + (mp_digit)((v >> (ix * CHAR_BIT)) & UCHAR_MAX)); + if(res != MP_OKAY) + return res; + + } + + if(z < 0) + SIGN(mp) = MP_NEG; + + return MP_OKAY; + +} /* end mp_set_int() */ + +/* }}} */ + +/*------------------------------------------------------------------------*/ +/* {{{ Digit arithmetic */ + +/* {{{ mp_add_d(a, d, b) */ + +/* + mp_add_d(a, d, b) + + Compute the sum b = a + d, for a single digit d. Respects the sign of + its primary addend (single digits are unsigned anyway). + */ + +mp_err mp_add_d(mp_int *a, mp_digit d, mp_int *b) +{ + mp_err res = MP_OKAY; + + ARGCHK(a != NULL && b != NULL, MP_BADARG); + + if((res = mp_copy(a, b)) != MP_OKAY) + return res; + + if(SIGN(b) == MP_ZPOS) { + res = s_mp_add_d(b, d); + } else if(s_mp_cmp_d(b, d) >= 0) { + res = s_mp_sub_d(b, d); + } else { + SIGN(b) = MP_ZPOS; + + DIGIT(b, 0) = d - DIGIT(b, 0); + } + + return res; + +} /* end mp_add_d() */ + +/* }}} */ + +/* {{{ mp_sub_d(a, d, b) */ + +/* + mp_sub_d(a, d, b) + + Compute the difference b = a - d, for a single digit d. Respects the + sign of its subtrahend (single digits are unsigned anyway). + */ + +mp_err mp_sub_d(mp_int *a, mp_digit d, mp_int *b) +{ + mp_err res; + + ARGCHK(a != NULL && b != NULL, MP_BADARG); + + if((res = mp_copy(a, b)) != MP_OKAY) + return res; + + if(SIGN(b) == MP_NEG) { + if((res = s_mp_add_d(b, d)) != MP_OKAY) + return res; + + } else if(s_mp_cmp_d(b, d) >= 0) { + if((res = s_mp_sub_d(b, d)) != MP_OKAY) + return res; + + } else { + mp_neg(b, b); + + DIGIT(b, 0) = d - DIGIT(b, 0); + SIGN(b) = MP_NEG; + } + + if(s_mp_cmp_d(b, 0) == 0) + SIGN(b) = MP_ZPOS; + + return MP_OKAY; + +} /* end mp_sub_d() */ + +/* }}} */ + +/* {{{ mp_mul_d(a, d, b) */ + +/* + mp_mul_d(a, d, b) + + Compute the product b = a * d, for a single digit d. Respects the sign + of its multiplicand (single digits are unsigned anyway) + */ + +mp_err mp_mul_d(mp_int *a, mp_digit d, mp_int *b) +{ + mp_err res; + + ARGCHK(a != NULL && b != NULL, MP_BADARG); + + if(d == 0) { + mp_zero(b); + return MP_OKAY; + } + + if((res = mp_copy(a, b)) != MP_OKAY) + return res; + + res = s_mp_mul_d(b, d); + + return res; + +} /* end mp_mul_d() */ + +/* }}} */ + +/* {{{ mp_mul_2(a, c) */ + +mp_err mp_mul_2(mp_int *a, mp_int *c) +{ + mp_err res; + + ARGCHK(a != NULL && c != NULL, MP_BADARG); + + if((res = mp_copy(a, c)) != MP_OKAY) + return res; + + return s_mp_mul_2(c); + +} /* end mp_mul_2() */ + +/* }}} */ + +/* {{{ mp_div_d(a, d, q, r) */ + +/* + mp_div_d(a, d, q, r) + + Compute the quotient q = a / d and remainder r = a mod d, for a + single digit d. Respects the sign of its divisor (single digits are + unsigned anyway). + */ + +mp_err mp_div_d(mp_int *a, mp_digit d, mp_int *q, mp_digit *r) +{ + mp_err res; + mp_digit rem; + int pow; + + ARGCHK(a != NULL, MP_BADARG); + + if(d == 0) + return MP_RANGE; + + /* Shortcut for powers of two ... */ + if((pow = s_mp_ispow2d(d)) >= 0) { + mp_digit mask; + + mask = (1 << pow) - 1; + rem = DIGIT(a, 0) & mask; + + if(q) { + mp_copy(a, q); + s_mp_div_2d(q, pow); + } + + if(r) + *r = rem; + + return MP_OKAY; + } + + /* + If the quotient is actually going to be returned, we'll try to + avoid hitting the memory allocator by copying the dividend into it + and doing the division there. This can't be any _worse_ than + always copying, and will sometimes be better (since it won't make + another copy) + + If it's not going to be returned, we need to allocate a temporary + to hold the quotient, which will just be discarded. + */ + if(q) { + if((res = mp_copy(a, q)) != MP_OKAY) + return res; + + res = s_mp_div_d(q, d, &rem); + if(s_mp_cmp_d(q, 0) == MP_EQ) + SIGN(q) = MP_ZPOS; + + } else { + mp_int qp; + + if((res = mp_init_copy(&qp, a)) != MP_OKAY) + return res; + + res = s_mp_div_d(&qp, d, &rem); + if(s_mp_cmp_d(&qp, 0) == 0) + SIGN(&qp) = MP_ZPOS; + + mp_clear(&qp); + } + + if(r) + *r = rem; + + return res; + +} /* end mp_div_d() */ + +/* }}} */ + +/* {{{ mp_div_2(a, c) */ + +/* + mp_div_2(a, c) + + Compute c = a / 2, disregarding the remainder. + */ + +mp_err mp_div_2(mp_int *a, mp_int *c) +{ + mp_err res; + + ARGCHK(a != NULL && c != NULL, MP_BADARG); + + if((res = mp_copy(a, c)) != MP_OKAY) + return res; + + s_mp_div_2(c); + + return MP_OKAY; + +} /* end mp_div_2() */ + +/* }}} */ + +/* {{{ mp_expt_d(a, d, b) */ + +mp_err mp_expt_d(mp_int *a, mp_digit d, mp_int *c) +{ + mp_int s, x; + mp_err res; + + ARGCHK(a != NULL && c != NULL, MP_BADARG); + + if((res = mp_init(&s)) != MP_OKAY) + return res; + if((res = mp_init_copy(&x, a)) != MP_OKAY) + goto X; + + DIGIT(&s, 0) = 1; + + while(d != 0) { + if(d & 1) { + if((res = s_mp_mul(&s, &x)) != MP_OKAY) + goto CLEANUP; + } + + d >>= 1; + + if((res = s_mp_sqr(&x)) != MP_OKAY) + goto CLEANUP; + } + + s_mp_exch(&s, c); + +CLEANUP: + mp_clear(&x); +X: + mp_clear(&s); + + return res; + +} /* end mp_expt_d() */ + +/* }}} */ + +/* }}} */ + +/*------------------------------------------------------------------------*/ +/* {{{ Full arithmetic */ + +/* {{{ mp_abs(a, b) */ + +/* + mp_abs(a, b) + + Compute b = |a|. 'a' and 'b' may be identical. + */ + +mp_err mp_abs(mp_int *a, mp_int *b) +{ + mp_err res; + + ARGCHK(a != NULL && b != NULL, MP_BADARG); + + if((res = mp_copy(a, b)) != MP_OKAY) + return res; + + SIGN(b) = MP_ZPOS; + + return MP_OKAY; + +} /* end mp_abs() */ + +/* }}} */ + +/* {{{ mp_neg(a, b) */ + +/* + mp_neg(a, b) + + Compute b = -a. 'a' and 'b' may be identical. + */ + +mp_err mp_neg(mp_int *a, mp_int *b) +{ + mp_err res; + + ARGCHK(a != NULL && b != NULL, MP_BADARG); + + if((res = mp_copy(a, b)) != MP_OKAY) + return res; + + if(s_mp_cmp_d(b, 0) == MP_EQ) + SIGN(b) = MP_ZPOS; + else + SIGN(b) = (SIGN(b) == MP_NEG) ? MP_ZPOS : MP_NEG; + + return MP_OKAY; + +} /* end mp_neg() */ + +/* }}} */ + +/* {{{ mp_add(a, b, c) */ + +/* + mp_add(a, b, c) + + Compute c = a + b. All parameters may be identical. + */ + +mp_err mp_add(mp_int *a, mp_int *b, mp_int *c) +{ + mp_err res; + int cmp; + + ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); + + if(SIGN(a) == SIGN(b)) { /* same sign: add values, keep sign */ + + /* Commutativity of addition lets us do this in either order, + so we avoid having to use a temporary even if the result + is supposed to replace the output + */ + if(c == b) { + if((res = s_mp_add(c, a)) != MP_OKAY) + return res; + } else { + if(c != a && (res = mp_copy(a, c)) != MP_OKAY) + return res; + + if((res = s_mp_add(c, b)) != MP_OKAY) + return res; + } + + } else if((cmp = s_mp_cmp(a, b)) > 0) { /* different sign: a > b */ + + /* If the output is going to be clobbered, we will use a temporary + variable; otherwise, we'll do it without touching the memory + allocator at all, if possible + */ + if(c == b) { + mp_int tmp; + + if((res = mp_init_copy(&tmp, a)) != MP_OKAY) + return res; + if((res = s_mp_sub(&tmp, b)) != MP_OKAY) { + mp_clear(&tmp); + return res; + } + + s_mp_exch(&tmp, c); + mp_clear(&tmp); + + } else { + + if(c != a && (res = mp_copy(a, c)) != MP_OKAY) + return res; + if((res = s_mp_sub(c, b)) != MP_OKAY) + return res; + + } + + } else if(cmp == 0) { /* different sign, a == b */ + + mp_zero(c); + return MP_OKAY; + + } else { /* different sign: a < b */ + + /* See above... */ + if(c == a) { + mp_int tmp; + + if((res = mp_init_copy(&tmp, b)) != MP_OKAY) + return res; + if((res = s_mp_sub(&tmp, a)) != MP_OKAY) { + mp_clear(&tmp); + return res; + } + + s_mp_exch(&tmp, c); + mp_clear(&tmp); + + } else { + + if(c != b && (res = mp_copy(b, c)) != MP_OKAY) + return res; + if((res = s_mp_sub(c, a)) != MP_OKAY) + return res; + + } + } + + if(USED(c) == 1 && DIGIT(c, 0) == 0) + SIGN(c) = MP_ZPOS; + + return MP_OKAY; + +} /* end mp_add() */ + +/* }}} */ + +/* {{{ mp_sub(a, b, c) */ + +/* + mp_sub(a, b, c) + + Compute c = a - b. All parameters may be identical. + */ + +mp_err mp_sub(mp_int *a, mp_int *b, mp_int *c) +{ + mp_err res; + int cmp; + + ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); + + if(SIGN(a) != SIGN(b)) { + if(c == a) { + if((res = s_mp_add(c, b)) != MP_OKAY) + return res; + } else { + if(c != b && ((res = mp_copy(b, c)) != MP_OKAY)) + return res; + if((res = s_mp_add(c, a)) != MP_OKAY) + return res; + SIGN(c) = SIGN(a); + } + + } else if((cmp = s_mp_cmp(a, b)) > 0) { /* Same sign, a > b */ + if(c == b) { + mp_int tmp; + + if((res = mp_init_copy(&tmp, a)) != MP_OKAY) + return res; + if((res = s_mp_sub(&tmp, b)) != MP_OKAY) { + mp_clear(&tmp); + return res; + } + s_mp_exch(&tmp, c); + mp_clear(&tmp); + + } else { + if(c != a && ((res = mp_copy(a, c)) != MP_OKAY)) + return res; + + if((res = s_mp_sub(c, b)) != MP_OKAY) + return res; + } + + } else if(cmp == 0) { /* Same sign, equal magnitude */ + mp_zero(c); + return MP_OKAY; + + } else { /* Same sign, b > a */ + if(c == a) { + mp_int tmp; + + if((res = mp_init_copy(&tmp, b)) != MP_OKAY) + return res; + + if((res = s_mp_sub(&tmp, a)) != MP_OKAY) { + mp_clear(&tmp); + return res; + } + s_mp_exch(&tmp, c); + mp_clear(&tmp); + + } else { + if(c != b && ((res = mp_copy(b, c)) != MP_OKAY)) + return res; + + if((res = s_mp_sub(c, a)) != MP_OKAY) + return res; + } + + SIGN(c) = !SIGN(b); + } + + if(USED(c) == 1 && DIGIT(c, 0) == 0) + SIGN(c) = MP_ZPOS; + + return MP_OKAY; + +} /* end mp_sub() */ + +/* }}} */ + +/* {{{ mp_mul(a, b, c) */ + +/* + mp_mul(a, b, c) + + Compute c = a * b. All parameters may be identical. + */ + +mp_err mp_mul(mp_int *a, mp_int *b, mp_int *c) +{ + mp_err res; + mp_sign sgn; + + ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); + + sgn = (SIGN(a) == SIGN(b)) ? MP_ZPOS : MP_NEG; + + if(c == b) { + if((res = s_mp_mul(c, a)) != MP_OKAY) + return res; + + } else { + if((res = mp_copy(a, c)) != MP_OKAY) + return res; + + if((res = s_mp_mul(c, b)) != MP_OKAY) + return res; + } + + if(sgn == MP_ZPOS || s_mp_cmp_d(c, 0) == MP_EQ) + SIGN(c) = MP_ZPOS; + else + SIGN(c) = sgn; + + return MP_OKAY; + +} /* end mp_mul() */ + +/* }}} */ + +/* {{{ mp_mul_2d(a, d, c) */ + +/* + mp_mul_2d(a, d, c) + + Compute c = a * 2^d. a may be the same as c. + */ + +mp_err mp_mul_2d(mp_int *a, mp_digit d, mp_int *c) +{ + mp_err res; + + ARGCHK(a != NULL && c != NULL, MP_BADARG); + + if((res = mp_copy(a, c)) != MP_OKAY) + return res; + + if(d == 0) + return MP_OKAY; + + return s_mp_mul_2d(c, d); + +} /* end mp_mul() */ + +/* }}} */ + +/* {{{ mp_sqr(a, b) */ + +#if MP_SQUARE +mp_err mp_sqr(mp_int *a, mp_int *b) +{ + mp_err res; + + ARGCHK(a != NULL && b != NULL, MP_BADARG); + + if((res = mp_copy(a, b)) != MP_OKAY) + return res; + + if((res = s_mp_sqr(b)) != MP_OKAY) + return res; + + SIGN(b) = MP_ZPOS; + + return MP_OKAY; + +} /* end mp_sqr() */ +#endif + +/* }}} */ + +/* {{{ mp_div(a, b, q, r) */ + +/* + mp_div(a, b, q, r) + + Compute q = a / b and r = a mod b. Input parameters may be re-used + as output parameters. If q or r is NULL, that portion of the + computation will be discarded (although it will still be computed) + + Pay no attention to the hacker behind the curtain. + */ + +mp_err mp_div(mp_int *a, mp_int *b, mp_int *q, mp_int *r) +{ + mp_err res; + mp_int qtmp, rtmp; + int cmp; + + ARGCHK(a != NULL && b != NULL, MP_BADARG); + + if(mp_cmp_z(b) == MP_EQ) + return MP_RANGE; + + /* If a <= b, we can compute the solution without division, and + avoid any memory allocation + */ + if((cmp = s_mp_cmp(a, b)) < 0) { + if(r) { + if((res = mp_copy(a, r)) != MP_OKAY) + return res; + } + + if(q) + mp_zero(q); + + return MP_OKAY; + + } else if(cmp == 0) { + + /* Set quotient to 1, with appropriate sign */ + if(q) { + int qneg = (SIGN(a) != SIGN(b)); + + mp_set(q, 1); + if(qneg) + SIGN(q) = MP_NEG; + } + + if(r) + mp_zero(r); + + return MP_OKAY; + } + + /* If we get here, it means we actually have to do some division */ + + /* Set up some temporaries... */ + if((res = mp_init_copy(&qtmp, a)) != MP_OKAY) + return res; + if((res = mp_init_copy(&rtmp, b)) != MP_OKAY) + goto CLEANUP; + + if((res = s_mp_div(&qtmp, &rtmp)) != MP_OKAY) + goto CLEANUP; + + /* Compute the signs for the output */ + SIGN(&rtmp) = SIGN(a); /* Sr = Sa */ + if(SIGN(a) == SIGN(b)) + SIGN(&qtmp) = MP_ZPOS; /* Sq = MP_ZPOS if Sa = Sb */ + else + SIGN(&qtmp) = MP_NEG; /* Sq = MP_NEG if Sa != Sb */ + + if(s_mp_cmp_d(&qtmp, 0) == MP_EQ) + SIGN(&qtmp) = MP_ZPOS; + if(s_mp_cmp_d(&rtmp, 0) == MP_EQ) + SIGN(&rtmp) = MP_ZPOS; + + /* Copy output, if it is needed */ + if(q) + s_mp_exch(&qtmp, q); + + if(r) + s_mp_exch(&rtmp, r); + +CLEANUP: + mp_clear(&rtmp); + mp_clear(&qtmp); + + return res; + +} /* end mp_div() */ + +/* }}} */ + +/* {{{ mp_div_2d(a, d, q, r) */ + +mp_err mp_div_2d(mp_int *a, mp_digit d, mp_int *q, mp_int *r) +{ + mp_err res; + + ARGCHK(a != NULL, MP_BADARG); + + if(q) { + if((res = mp_copy(a, q)) != MP_OKAY) + return res; + + s_mp_div_2d(q, d); + } + + if(r) { + if((res = mp_copy(a, r)) != MP_OKAY) + return res; + + s_mp_mod_2d(r, d); + } + + return MP_OKAY; + +} /* end mp_div_2d() */ + +/* }}} */ + +/* {{{ mp_expt(a, b, c) */ + +/* + mp_expt(a, b, c) + + Compute c = a ** b, that is, raise a to the b power. Uses a + standard iterative square-and-multiply technique. + */ + +mp_err mp_expt(mp_int *a, mp_int *b, mp_int *c) +{ + mp_int s, x; + mp_err res; + mp_digit d; + int dig, bit; + + ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); + + if(mp_cmp_z(b) < 0) + return MP_RANGE; + + if((res = mp_init(&s)) != MP_OKAY) + return res; + + mp_set(&s, 1); + + if((res = mp_init_copy(&x, a)) != MP_OKAY) + goto X; + + /* Loop over low-order digits in ascending order */ + for(dig = 0; dig < (USED(b) - 1); dig++) { + d = DIGIT(b, dig); + + /* Loop over bits of each non-maximal digit */ + for(bit = 0; bit < DIGIT_BIT; bit++) { + if(d & 1) { + if((res = s_mp_mul(&s, &x)) != MP_OKAY) + goto CLEANUP; + } + + d >>= 1; + + if((res = s_mp_sqr(&x)) != MP_OKAY) + goto CLEANUP; + } + } + + /* Consider now the last digit... */ + d = DIGIT(b, dig); + + while(d) { + if(d & 1) { + if((res = s_mp_mul(&s, &x)) != MP_OKAY) + goto CLEANUP; + } + + d >>= 1; + + if((res = s_mp_sqr(&x)) != MP_OKAY) + goto CLEANUP; + } + + if(mp_iseven(b)) + SIGN(&s) = SIGN(a); + + res = mp_copy(&s, c); + +CLEANUP: + mp_clear(&x); +X: + mp_clear(&s); + + return res; + +} /* end mp_expt() */ + +/* }}} */ + +/* {{{ mp_2expt(a, k) */ + +/* Compute a = 2^k */ + +mp_err mp_2expt(mp_int *a, mp_digit k) +{ + ARGCHK(a != NULL, MP_BADARG); + + return s_mp_2expt(a, k); + +} /* end mp_2expt() */ + +/* }}} */ + +/* {{{ mp_mod(a, m, c) */ + +/* + mp_mod(a, m, c) + + Compute c = a (mod m). Result will always be 0 <= c < m. + */ + +mp_err mp_mod(mp_int *a, mp_int *m, mp_int *c) +{ + mp_err res; + int mag; + + ARGCHK(a != NULL && m != NULL && c != NULL, MP_BADARG); + + if(SIGN(m) == MP_NEG) + return MP_RANGE; + + /* + If |a| > m, we need to divide to get the remainder and take the + absolute value. + + If |a| < m, we don't need to do any division, just copy and adjust + the sign (if a is negative). + + If |a| == m, we can simply set the result to zero. + + This order is intended to minimize the average path length of the + comparison chain on common workloads -- the most frequent cases are + that |a| != m, so we do those first. + */ + if((mag = s_mp_cmp(a, m)) > 0) { + if((res = mp_div(a, m, NULL, c)) != MP_OKAY) + return res; + + if(SIGN(c) == MP_NEG) { + if((res = mp_add(c, m, c)) != MP_OKAY) + return res; + } + + } else if(mag < 0) { + if((res = mp_copy(a, c)) != MP_OKAY) + return res; + + if(mp_cmp_z(a) < 0) { + if((res = mp_add(c, m, c)) != MP_OKAY) + return res; + + } + + } else { + mp_zero(c); + + } + + return MP_OKAY; + +} /* end mp_mod() */ + +/* }}} */ + +/* {{{ mp_mod_d(a, d, c) */ + +/* + mp_mod_d(a, d, c) + + Compute c = a (mod d). Result will always be 0 <= c < d + */ +mp_err mp_mod_d(mp_int *a, mp_digit d, mp_digit *c) +{ + mp_err res; + mp_digit rem; + + ARGCHK(a != NULL && c != NULL, MP_BADARG); + + if(s_mp_cmp_d(a, d) > 0) { + if((res = mp_div_d(a, d, NULL, &rem)) != MP_OKAY) + return res; + + } else { + if(SIGN(a) == MP_NEG) + rem = d - DIGIT(a, 0); + else + rem = DIGIT(a, 0); + } + + if(c) + *c = rem; + + return MP_OKAY; + +} /* end mp_mod_d() */ + +/* }}} */ + +/* {{{ mp_sqrt(a, b) */ + +/* + mp_sqrt(a, b) + + Compute the integer square root of a, and store the result in b. + Uses an integer-arithmetic version of Newton's iterative linear + approximation technique to determine this value; the result has the + following two properties: + + b^2 <= a + (b+1)^2 >= a + + It is a range error to pass a negative value. + */ +mp_err mp_sqrt(mp_int *a, mp_int *b) +{ + mp_int x, t; + mp_err res; + + ARGCHK(a != NULL && b != NULL, MP_BADARG); + + /* Cannot take square root of a negative value */ + if(SIGN(a) == MP_NEG) + return MP_RANGE; + + /* Special cases for zero and one, trivial */ + if(mp_cmp_d(a, 0) == MP_EQ || mp_cmp_d(a, 1) == MP_EQ) + return mp_copy(a, b); + + /* Initialize the temporaries we'll use below */ + if((res = mp_init_size(&t, USED(a))) != MP_OKAY) + return res; + + /* Compute an initial guess for the iteration as a itself */ + if((res = mp_init_copy(&x, a)) != MP_OKAY) + goto X; + +s_mp_rshd(&x, (USED(&x)/2)+1); +mp_add_d(&x, 1, &x); + + for(;;) { + /* t = (x * x) - a */ + mp_copy(&x, &t); /* can't fail, t is big enough for original x */ + if((res = mp_sqr(&t, &t)) != MP_OKAY || + (res = mp_sub(&t, a, &t)) != MP_OKAY) + goto CLEANUP; + + /* t = t / 2x */ + s_mp_mul_2(&x); + if((res = mp_div(&t, &x, &t, NULL)) != MP_OKAY) + goto CLEANUP; + s_mp_div_2(&x); + + /* Terminate the loop, if the quotient is zero */ + if(mp_cmp_z(&t) == MP_EQ) + break; + + /* x = x - t */ + if((res = mp_sub(&x, &t, &x)) != MP_OKAY) + goto CLEANUP; + + } + + /* Copy result to output parameter */ + mp_sub_d(&x, 1, &x); + s_mp_exch(&x, b); + + CLEANUP: + mp_clear(&x); + X: + mp_clear(&t); + + return res; + +} /* end mp_sqrt() */ + +/* }}} */ + +/* }}} */ + +/*------------------------------------------------------------------------*/ +/* {{{ Modular arithmetic */ + +#if MP_MODARITH +/* {{{ mp_addmod(a, b, m, c) */ + +/* + mp_addmod(a, b, m, c) + + Compute c = (a + b) mod m + */ + +mp_err mp_addmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) +{ + mp_err res; + + ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG); + + if((res = mp_add(a, b, c)) != MP_OKAY) + return res; + if((res = mp_mod(c, m, c)) != MP_OKAY) + return res; + + return MP_OKAY; + +} + +/* }}} */ + +/* {{{ mp_submod(a, b, m, c) */ + +/* + mp_submod(a, b, m, c) + + Compute c = (a - b) mod m + */ + +mp_err mp_submod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) +{ + mp_err res; + + ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG); + + if((res = mp_sub(a, b, c)) != MP_OKAY) + return res; + if((res = mp_mod(c, m, c)) != MP_OKAY) + return res; + + return MP_OKAY; + +} + +/* }}} */ + +/* {{{ mp_mulmod(a, b, m, c) */ + +/* + mp_mulmod(a, b, m, c) + + Compute c = (a * b) mod m + */ + +mp_err mp_mulmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) +{ + mp_err res; + + ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG); + + if((res = mp_mul(a, b, c)) != MP_OKAY) + return res; + if((res = mp_mod(c, m, c)) != MP_OKAY) + return res; + + return MP_OKAY; + +} + +/* }}} */ + +/* {{{ mp_sqrmod(a, m, c) */ + +#if MP_SQUARE +mp_err mp_sqrmod(mp_int *a, mp_int *m, mp_int *c) +{ + mp_err res; + + ARGCHK(a != NULL && m != NULL && c != NULL, MP_BADARG); + + if((res = mp_sqr(a, c)) != MP_OKAY) + return res; + if((res = mp_mod(c, m, c)) != MP_OKAY) + return res; + + return MP_OKAY; + +} /* end mp_sqrmod() */ +#endif + +/* }}} */ + +/* {{{ mp_exptmod(a, b, m, c) */ + +/* + mp_exptmod(a, b, m, c) + + Compute c = (a ** b) mod m. Uses a standard square-and-multiply + method with modular reductions at each step. (This is basically the + same code as mp_expt(), except for the addition of the reductions) + + The modular reductions are done using Barrett's algorithm (see + s_mp_reduce() below for details) + */ + +mp_err mp_exptmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) +{ + mp_int s, x, mu; + mp_err res; + mp_digit d, *db = DIGITS(b); + mp_size ub = USED(b); + int dig, bit; + + ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); + + if(mp_cmp_z(b) < 0 || mp_cmp_z(m) <= 0) + return MP_RANGE; + + if((res = mp_init(&s)) != MP_OKAY) + return res; + if((res = mp_init_copy(&x, a)) != MP_OKAY) + goto X; + if((res = mp_mod(&x, m, &x)) != MP_OKAY || + (res = mp_init(&mu)) != MP_OKAY) + goto MU; + + mp_set(&s, 1); + + /* mu = b^2k / m */ + s_mp_add_d(&mu, 1); + s_mp_lshd(&mu, 2 * USED(m)); + if((res = mp_div(&mu, m, &mu, NULL)) != MP_OKAY) + goto CLEANUP; + + /* Loop over digits of b in ascending order, except highest order */ + for(dig = 0; dig < (ub - 1); dig++) { + d = *db++; + + /* Loop over the bits of the lower-order digits */ + for(bit = 0; bit < DIGIT_BIT; bit++) { + if(d & 1) { + if((res = s_mp_mul(&s, &x)) != MP_OKAY) + goto CLEANUP; + if((res = s_mp_reduce(&s, m, &mu)) != MP_OKAY) + goto CLEANUP; + } + + d >>= 1; + + if((res = s_mp_sqr(&x)) != MP_OKAY) + goto CLEANUP; + if((res = s_mp_reduce(&x, m, &mu)) != MP_OKAY) + goto CLEANUP; + } + } + + /* Now do the last digit... */ + d = *db; + + while(d) { + if(d & 1) { + if((res = s_mp_mul(&s, &x)) != MP_OKAY) + goto CLEANUP; + if((res = s_mp_reduce(&s, m, &mu)) != MP_OKAY) + goto CLEANUP; + } + + d >>= 1; + + if((res = s_mp_sqr(&x)) != MP_OKAY) + goto CLEANUP; + if((res = s_mp_reduce(&x, m, &mu)) != MP_OKAY) + goto CLEANUP; + } + + s_mp_exch(&s, c); + + CLEANUP: + mp_clear(&mu); + MU: + mp_clear(&x); + X: + mp_clear(&s); + + return res; + +} /* end mp_exptmod() */ + +/* }}} */ + +/* {{{ mp_exptmod_d(a, d, m, c) */ + +mp_err mp_exptmod_d(mp_int *a, mp_digit d, mp_int *m, mp_int *c) +{ + mp_int s, x; + mp_err res; + + ARGCHK(a != NULL && c != NULL, MP_BADARG); + + if((res = mp_init(&s)) != MP_OKAY) + return res; + if((res = mp_init_copy(&x, a)) != MP_OKAY) + goto X; + + mp_set(&s, 1); + + while(d != 0) { + if(d & 1) { + if((res = s_mp_mul(&s, &x)) != MP_OKAY || + (res = mp_mod(&s, m, &s)) != MP_OKAY) + goto CLEANUP; + } + + d /= 2; + + if((res = s_mp_sqr(&x)) != MP_OKAY || + (res = mp_mod(&x, m, &x)) != MP_OKAY) + goto CLEANUP; + } + + s_mp_exch(&s, c); + +CLEANUP: + mp_clear(&x); +X: + mp_clear(&s); + + return res; + +} /* end mp_exptmod_d() */ + +/* }}} */ +#endif /* if MP_MODARITH */ + +/* }}} */ + +/*------------------------------------------------------------------------*/ +/* {{{ Comparison functions */ + +/* {{{ mp_cmp_z(a) */ + +/* + mp_cmp_z(a) + + Compare a <=> 0. Returns <0 if a<0, 0 if a=0, >0 if a>0. + */ + +int mp_cmp_z(mp_int *a) +{ + if(SIGN(a) == MP_NEG) + return MP_LT; + else if(USED(a) == 1 && DIGIT(a, 0) == 0) + return MP_EQ; + else + return MP_GT; + +} /* end mp_cmp_z() */ + +/* }}} */ + +/* {{{ mp_cmp_d(a, d) */ + +/* + mp_cmp_d(a, d) + + Compare a <=> d. Returns <0 if a0 if a>d + */ + +int mp_cmp_d(mp_int *a, mp_digit d) +{ + ARGCHK(a != NULL, MP_EQ); + + if(SIGN(a) == MP_NEG) + return MP_LT; + + return s_mp_cmp_d(a, d); + +} /* end mp_cmp_d() */ + +/* }}} */ + +/* {{{ mp_cmp(a, b) */ + +int mp_cmp(mp_int *a, mp_int *b) +{ + ARGCHK(a != NULL && b != NULL, MP_EQ); + + if(SIGN(a) == SIGN(b)) { + int mag; + + if((mag = s_mp_cmp(a, b)) == MP_EQ) + return MP_EQ; + + if(SIGN(a) == MP_ZPOS) + return mag; + else + return -mag; + + } else if(SIGN(a) == MP_ZPOS) { + return MP_GT; + } else { + return MP_LT; + } + +} /* end mp_cmp() */ + +/* }}} */ + +/* {{{ mp_cmp_mag(a, b) */ + +/* + mp_cmp_mag(a, b) + + Compares |a| <=> |b|, and returns an appropriate comparison result + */ + +int mp_cmp_mag(mp_int *a, mp_int *b) +{ + ARGCHK(a != NULL && b != NULL, MP_EQ); + + return s_mp_cmp(a, b); + +} /* end mp_cmp_mag() */ + +/* }}} */ + +/* {{{ mp_cmp_int(a, z) */ + +/* + This just converts z to an mp_int, and uses the existing comparison + routines. This is sort of inefficient, but it's not clear to me how + frequently this wil get used anyway. For small positive constants, + you can always use mp_cmp_d(), and for zero, there is mp_cmp_z(). + */ +int mp_cmp_int(mp_int *a, long z) +{ + mp_int tmp; + int out; + + ARGCHK(a != NULL, MP_EQ); + + mp_init(&tmp); mp_set_int(&tmp, z); + out = mp_cmp(a, &tmp); + mp_clear(&tmp); + + return out; + +} /* end mp_cmp_int() */ + +/* }}} */ + +/* {{{ mp_isodd(a) */ + +/* + mp_isodd(a) + + Returns a true (non-zero) value if a is odd, false (zero) otherwise. + */ +int mp_isodd(mp_int *a) +{ + ARGCHK(a != NULL, 0); + + return (DIGIT(a, 0) & 1); + +} /* end mp_isodd() */ + +/* }}} */ + +/* {{{ mp_iseven(a) */ + +int mp_iseven(mp_int *a) +{ + return !mp_isodd(a); + +} /* end mp_iseven() */ + +/* }}} */ + +/* }}} */ + +/*------------------------------------------------------------------------*/ +/* {{{ Number theoretic functions */ + +#if MP_NUMTH +/* {{{ mp_gcd(a, b, c) */ + +/* + Like the old mp_gcd() function, except computes the GCD using the + binary algorithm due to Josef Stein in 1961 (via Knuth). + */ +mp_err mp_gcd(mp_int *a, mp_int *b, mp_int *c) +{ + mp_err res; + mp_int u, v, t; + mp_size k = 0; + + ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); + + if(mp_cmp_z(a) == MP_EQ && mp_cmp_z(b) == MP_EQ) + return MP_RANGE; + if(mp_cmp_z(a) == MP_EQ) { + return mp_copy(b, c); + } else if(mp_cmp_z(b) == MP_EQ) { + return mp_copy(a, c); + } + + if((res = mp_init(&t)) != MP_OKAY) + return res; + if((res = mp_init_copy(&u, a)) != MP_OKAY) + goto U; + if((res = mp_init_copy(&v, b)) != MP_OKAY) + goto V; + + SIGN(&u) = MP_ZPOS; + SIGN(&v) = MP_ZPOS; + + /* Divide out common factors of 2 until at least 1 of a, b is even */ + while(mp_iseven(&u) && mp_iseven(&v)) { + s_mp_div_2(&u); + s_mp_div_2(&v); + ++k; + } + + /* Initialize t */ + if(mp_isodd(&u)) { + if((res = mp_copy(&v, &t)) != MP_OKAY) + goto CLEANUP; + + /* t = -v */ + if(SIGN(&v) == MP_ZPOS) + SIGN(&t) = MP_NEG; + else + SIGN(&t) = MP_ZPOS; + + } else { + if((res = mp_copy(&u, &t)) != MP_OKAY) + goto CLEANUP; + + } + + for(;;) { + while(mp_iseven(&t)) { + s_mp_div_2(&t); + } + + if(mp_cmp_z(&t) == MP_GT) { + if((res = mp_copy(&t, &u)) != MP_OKAY) + goto CLEANUP; + + } else { + if((res = mp_copy(&t, &v)) != MP_OKAY) + goto CLEANUP; + + /* v = -t */ + if(SIGN(&t) == MP_ZPOS) + SIGN(&v) = MP_NEG; + else + SIGN(&v) = MP_ZPOS; + } + + if((res = mp_sub(&u, &v, &t)) != MP_OKAY) + goto CLEANUP; + + if(s_mp_cmp_d(&t, 0) == MP_EQ) + break; + } + + s_mp_2expt(&v, k); /* v = 2^k */ + res = mp_mul(&u, &v, c); /* c = u * v */ + + CLEANUP: + mp_clear(&v); + V: + mp_clear(&u); + U: + mp_clear(&t); + + return res; + +} /* end mp_bgcd() */ + +/* }}} */ + +/* {{{ mp_lcm(a, b, c) */ + +/* We compute the least common multiple using the rule: + + ab = [a, b](a, b) + + ... by computing the product, and dividing out the gcd. + */ + +mp_err mp_lcm(mp_int *a, mp_int *b, mp_int *c) +{ + mp_int gcd, prod; + mp_err res; + + ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); + + /* Set up temporaries */ + if((res = mp_init(&gcd)) != MP_OKAY) + return res; + if((res = mp_init(&prod)) != MP_OKAY) + goto GCD; + + if((res = mp_mul(a, b, &prod)) != MP_OKAY) + goto CLEANUP; + if((res = mp_gcd(a, b, &gcd)) != MP_OKAY) + goto CLEANUP; + + res = mp_div(&prod, &gcd, c, NULL); + + CLEANUP: + mp_clear(&prod); + GCD: + mp_clear(&gcd); + + return res; + +} /* end mp_lcm() */ + +/* }}} */ + +/* {{{ mp_xgcd(a, b, g, x, y) */ + +/* + mp_xgcd(a, b, g, x, y) + + Compute g = (a, b) and values x and y satisfying Bezout's identity + (that is, ax + by = g). This uses the extended binary GCD algorithm + based on the Stein algorithm used for mp_gcd() + */ + +mp_err mp_xgcd(mp_int *a, mp_int *b, mp_int *g, mp_int *x, mp_int *y) +{ + mp_int gx, xc, yc, u, v, A, B, C, D; + mp_int *clean[9]; + mp_err res; + int last = -1; + + if(mp_cmp_z(b) == 0) + return MP_RANGE; + + /* Initialize all these variables we need */ + if((res = mp_init(&u)) != MP_OKAY) goto CLEANUP; + clean[++last] = &u; + if((res = mp_init(&v)) != MP_OKAY) goto CLEANUP; + clean[++last] = &v; + if((res = mp_init(&gx)) != MP_OKAY) goto CLEANUP; + clean[++last] = &gx; + if((res = mp_init(&A)) != MP_OKAY) goto CLEANUP; + clean[++last] = &A; + if((res = mp_init(&B)) != MP_OKAY) goto CLEANUP; + clean[++last] = &B; + if((res = mp_init(&C)) != MP_OKAY) goto CLEANUP; + clean[++last] = &C; + if((res = mp_init(&D)) != MP_OKAY) goto CLEANUP; + clean[++last] = &D; + if((res = mp_init_copy(&xc, a)) != MP_OKAY) goto CLEANUP; + clean[++last] = &xc; + mp_abs(&xc, &xc); + if((res = mp_init_copy(&yc, b)) != MP_OKAY) goto CLEANUP; + clean[++last] = &yc; + mp_abs(&yc, &yc); + + mp_set(&gx, 1); + + /* Divide by two until at least one of them is even */ + while(mp_iseven(&xc) && mp_iseven(&yc)) { + s_mp_div_2(&xc); + s_mp_div_2(&yc); + if((res = s_mp_mul_2(&gx)) != MP_OKAY) + goto CLEANUP; + } + + mp_copy(&xc, &u); + mp_copy(&yc, &v); + mp_set(&A, 1); mp_set(&D, 1); + + /* Loop through binary GCD algorithm */ + for(;;) { + while(mp_iseven(&u)) { + s_mp_div_2(&u); + + if(mp_iseven(&A) && mp_iseven(&B)) { + s_mp_div_2(&A); s_mp_div_2(&B); + } else { + if((res = mp_add(&A, &yc, &A)) != MP_OKAY) goto CLEANUP; + s_mp_div_2(&A); + if((res = mp_sub(&B, &xc, &B)) != MP_OKAY) goto CLEANUP; + s_mp_div_2(&B); + } + } + + while(mp_iseven(&v)) { + s_mp_div_2(&v); + + if(mp_iseven(&C) && mp_iseven(&D)) { + s_mp_div_2(&C); s_mp_div_2(&D); + } else { + if((res = mp_add(&C, &yc, &C)) != MP_OKAY) goto CLEANUP; + s_mp_div_2(&C); + if((res = mp_sub(&D, &xc, &D)) != MP_OKAY) goto CLEANUP; + s_mp_div_2(&D); + } + } + + if(mp_cmp(&u, &v) >= 0) { + if((res = mp_sub(&u, &v, &u)) != MP_OKAY) goto CLEANUP; + if((res = mp_sub(&A, &C, &A)) != MP_OKAY) goto CLEANUP; + if((res = mp_sub(&B, &D, &B)) != MP_OKAY) goto CLEANUP; + + } else { + if((res = mp_sub(&v, &u, &v)) != MP_OKAY) goto CLEANUP; + if((res = mp_sub(&C, &A, &C)) != MP_OKAY) goto CLEANUP; + if((res = mp_sub(&D, &B, &D)) != MP_OKAY) goto CLEANUP; + + } + + /* If we're done, copy results to output */ + if(mp_cmp_z(&u) == 0) { + if(x) + if((res = mp_copy(&C, x)) != MP_OKAY) goto CLEANUP; + + if(y) + if((res = mp_copy(&D, y)) != MP_OKAY) goto CLEANUP; + + if(g) + if((res = mp_mul(&gx, &v, g)) != MP_OKAY) goto CLEANUP; + + break; + } + } + + CLEANUP: + while(last >= 0) + mp_clear(clean[last--]); + + return res; + +} /* end mp_xgcd() */ + +/* }}} */ + +/* {{{ mp_invmod(a, m, c) */ + +/* + mp_invmod(a, m, c) + + Compute c = a^-1 (mod m), if there is an inverse for a (mod m). + This is equivalent to the question of whether (a, m) = 1. If not, + MP_UNDEF is returned, and there is no inverse. + */ + +mp_err mp_invmod(mp_int *a, mp_int *m, mp_int *c) +{ + mp_int g, x; + mp_err res; + + ARGCHK(a && m && c, MP_BADARG); + + if(mp_cmp_z(a) == 0 || mp_cmp_z(m) == 0) + return MP_RANGE; + + if((res = mp_init(&g)) != MP_OKAY) + return res; + if((res = mp_init(&x)) != MP_OKAY) + goto X; + + if((res = mp_xgcd(a, m, &g, &x, NULL)) != MP_OKAY) + goto CLEANUP; + + if(mp_cmp_d(&g, 1) != MP_EQ) { + res = MP_UNDEF; + goto CLEANUP; + } + + res = mp_mod(&x, m, c); + SIGN(c) = SIGN(a); + +CLEANUP: + mp_clear(&x); +X: + mp_clear(&g); + + return res; + +} /* end mp_invmod() */ + +/* }}} */ +#endif /* if MP_NUMTH */ + +/* }}} */ + +/*------------------------------------------------------------------------*/ +/* {{{ mp_print(mp, ofp) */ + +#if MP_IOFUNC +/* + mp_print(mp, ofp) + + Print a textual representation of the given mp_int on the output + stream 'ofp'. Output is generated using the internal radix. + */ + +void mp_print(mp_int *mp, FILE *ofp) +{ + int ix; + + if(mp == NULL || ofp == NULL) + return; + + fputc((SIGN(mp) == MP_NEG) ? '-' : '+', ofp); + + for(ix = USED(mp) - 1; ix >= 0; ix--) { + fprintf(ofp, DIGIT_FMT, DIGIT(mp, ix)); + } + +} /* end mp_print() */ + +#endif /* if MP_IOFUNC */ + +/* }}} */ + +/*------------------------------------------------------------------------*/ +/* {{{ More I/O Functions */ + +/* {{{ mp_read_signed_bin(mp, str, len) */ + +/* + mp_read_signed_bin(mp, str, len) + + Read in a raw value (base 256) into the given mp_int + */ + +mp_err mp_read_signed_bin(mp_int *mp, unsigned char *str, int len) +{ + mp_err res; + + ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG); + + if((res = mp_read_unsigned_bin(mp, str + 1, len - 1)) == MP_OKAY) { + /* Get sign from first byte */ + if(str[0]) + SIGN(mp) = MP_NEG; + else + SIGN(mp) = MP_ZPOS; + } + + return res; + +} /* end mp_read_signed_bin() */ + +/* }}} */ + +/* {{{ mp_signed_bin_size(mp) */ + +int mp_signed_bin_size(mp_int *mp) +{ + ARGCHK(mp != NULL, 0); + + return mp_unsigned_bin_size(mp) + 1; + +} /* end mp_signed_bin_size() */ + +/* }}} */ + +/* {{{ mp_to_signed_bin(mp, str) */ + +mp_err mp_to_signed_bin(mp_int *mp, unsigned char *str) +{ + ARGCHK(mp != NULL && str != NULL, MP_BADARG); + + /* Caller responsible for allocating enough memory (use mp_raw_size(mp)) */ + str[0] = (char)SIGN(mp); + + return mp_to_unsigned_bin(mp, str + 1); + +} /* end mp_to_signed_bin() */ + +/* }}} */ + +/* {{{ mp_read_unsigned_bin(mp, str, len) */ + +/* + mp_read_unsigned_bin(mp, str, len) + + Read in an unsigned value (base 256) into the given mp_int + */ + +mp_err mp_read_unsigned_bin(mp_int *mp, unsigned char *str, int len) +{ + int ix; + mp_err res; + + ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG); + + mp_zero(mp); + + for(ix = 0; ix < len; ix++) { + if((res = s_mp_mul_2d(mp, CHAR_BIT)) != MP_OKAY) + return res; + + if((res = mp_add_d(mp, str[ix], mp)) != MP_OKAY) + return res; + } + + return MP_OKAY; + +} /* end mp_read_unsigned_bin() */ + +/* }}} */ + +/* {{{ mp_unsigned_bin_size(mp) */ + +int mp_unsigned_bin_size(mp_int *mp) +{ + mp_digit topdig; + int count; + + ARGCHK(mp != NULL, 0); + + /* Special case for the value zero */ + if(USED(mp) == 1 && DIGIT(mp, 0) == 0) + return 1; + + count = (USED(mp) - 1) * sizeof(mp_digit); + topdig = DIGIT(mp, USED(mp) - 1); + + while(topdig != 0) { + ++count; + topdig >>= CHAR_BIT; + } + + return count; + +} /* end mp_unsigned_bin_size() */ + +/* }}} */ + +/* {{{ mp_to_unsigned_bin(mp, str) */ + +mp_err mp_to_unsigned_bin(mp_int *mp, unsigned char *str) +{ + mp_digit *dp, *end, d; + unsigned char *spos; + + ARGCHK(mp != NULL && str != NULL, MP_BADARG); + + dp = DIGITS(mp); + end = dp + USED(mp) - 1; + spos = str; + + /* Special case for zero, quick test */ + if(dp == end && *dp == 0) { + *str = '\0'; + return MP_OKAY; + } + + /* Generate digits in reverse order */ + while(dp < end) { + int ix; + + d = *dp; + for(ix = 0; ix < sizeof(mp_digit); ++ix) { + *spos = d & UCHAR_MAX; + d >>= CHAR_BIT; + ++spos; + } + + ++dp; + } + + /* Now handle last digit specially, high order zeroes are not written */ + d = *end; + while(d != 0) { + *spos = d & UCHAR_MAX; + d >>= CHAR_BIT; + ++spos; + } + + /* Reverse everything to get digits in the correct order */ + while(--spos > str) { + unsigned char t = *str; + *str = *spos; + *spos = t; + + ++str; + } + + return MP_OKAY; + +} /* end mp_to_unsigned_bin() */ + +/* }}} */ + +/* {{{ mp_count_bits(mp) */ + +int mp_count_bits(mp_int *mp) +{ + int len; + mp_digit d; + + ARGCHK(mp != NULL, MP_BADARG); + + len = DIGIT_BIT * (USED(mp) - 1); + d = DIGIT(mp, USED(mp) - 1); + + while(d != 0) { + ++len; + d >>= 1; + } + + return len; + +} /* end mp_count_bits() */ + +/* }}} */ + +/* {{{ mp_read_radix(mp, str, radix) */ + +/* + mp_read_radix(mp, str, radix) + + Read an integer from the given string, and set mp to the resulting + value. The input is presumed to be in base 10. Leading non-digit + characters are ignored, and the function reads until a non-digit + character or the end of the string. + */ + +mp_err mp_read_radix(mp_int *mp, unsigned char *str, int radix) +{ + int ix = 0, val = 0; + mp_err res; + mp_sign sig = MP_ZPOS; + + ARGCHK(mp != NULL && str != NULL && radix >= 2 && radix <= MAX_RADIX, + MP_BADARG); + + mp_zero(mp); + + /* Skip leading non-digit characters until a digit or '-' or '+' */ + while(str[ix] && + (s_mp_tovalue(str[ix], radix) < 0) && + str[ix] != '-' && + str[ix] != '+') { + ++ix; + } + + if(str[ix] == '-') { + sig = MP_NEG; + ++ix; + } else if(str[ix] == '+') { + sig = MP_ZPOS; /* this is the default anyway... */ + ++ix; + } + + while((val = s_mp_tovalue(str[ix], radix)) >= 0) { + if((res = s_mp_mul_d(mp, radix)) != MP_OKAY) + return res; + if((res = s_mp_add_d(mp, val)) != MP_OKAY) + return res; + ++ix; + } + + if(s_mp_cmp_d(mp, 0) == MP_EQ) + SIGN(mp) = MP_ZPOS; + else + SIGN(mp) = sig; + + return MP_OKAY; + +} /* end mp_read_radix() */ + +/* }}} */ + +/* {{{ mp_radix_size(mp, radix) */ + +int mp_radix_size(mp_int *mp, int radix) +{ + int len; + ARGCHK(mp != NULL, 0); + + len = s_mp_outlen(mp_count_bits(mp), radix) + 1; /* for NUL terminator */ + + if(mp_cmp_z(mp) < 0) + ++len; /* for sign */ + + return len; + +} /* end mp_radix_size() */ + +/* }}} */ + +/* {{{ mp_value_radix_size(num, qty, radix) */ + +/* num = number of digits + qty = number of bits per digit + radix = target base + + Return the number of digits in the specified radix that would be + needed to express 'num' digits of 'qty' bits each. + */ +int mp_value_radix_size(int num, int qty, int radix) +{ + ARGCHK(num >= 0 && qty > 0 && radix >= 2 && radix <= MAX_RADIX, 0); + + return s_mp_outlen(num * qty, radix); + +} /* end mp_value_radix_size() */ + +/* }}} */ + +/* {{{ mp_toradix(mp, str, radix) */ + +mp_err mp_toradix(mp_int *mp, unsigned char *str, int radix) +{ + int ix, pos = 0; + + ARGCHK(mp != NULL && str != NULL, MP_BADARG); + ARGCHK(radix > 1 && radix <= MAX_RADIX, MP_RANGE); + + if(mp_cmp_z(mp) == MP_EQ) { + str[0] = '0'; + str[1] = '\0'; + } else { + mp_err res; + mp_int tmp; + mp_sign sgn; + mp_digit rem, rdx = (mp_digit)radix; + char ch; + + if((res = mp_init_copy(&tmp, mp)) != MP_OKAY) + return res; + + /* Save sign for later, and take absolute value */ + sgn = SIGN(&tmp); SIGN(&tmp) = MP_ZPOS; + + /* Generate output digits in reverse order */ + while(mp_cmp_z(&tmp) != 0) { + if((res = s_mp_div_d(&tmp, rdx, &rem)) != MP_OKAY) { + mp_clear(&tmp); + return res; + } + + /* Generate digits, use capital letters */ + ch = s_mp_todigit(rem, radix, 0); + + str[pos++] = ch; + } + + /* Add - sign if original value was negative */ + if(sgn == MP_NEG) + str[pos++] = '-'; + + /* Add trailing NUL to end the string */ + str[pos--] = '\0'; + + /* Reverse the digits and sign indicator */ + ix = 0; + while(ix < pos) { + char tmp = str[ix]; + + str[ix] = str[pos]; + str[pos] = tmp; + ++ix; + --pos; + } + + mp_clear(&tmp); + } + + return MP_OKAY; + +} /* end mp_toradix() */ + +/* }}} */ + +/* {{{ mp_char2value(ch, r) */ + +int mp_char2value(char ch, int r) +{ + return s_mp_tovalue(ch, r); + +} /* end mp_tovalue() */ + +/* }}} */ + +/* }}} */ + +/* {{{ mp_strerror(ec) */ + +/* + mp_strerror(ec) + + Return a string describing the meaning of error code 'ec'. The + string returned is allocated in static memory, so the caller should + not attempt to modify or free the memory associated with this + string. + */ +const char *mp_strerror(mp_err ec) +{ + int aec = (ec < 0) ? -ec : ec; + + /* Code values are negative, so the senses of these comparisons + are accurate */ + if(ec < MP_LAST_CODE || ec > MP_OKAY) { + return mp_err_string[0]; /* unknown error code */ + } else { + return mp_err_string[aec + 1]; + } + +} /* end mp_strerror() */ + +/* }}} */ + +/*========================================================================*/ +/*------------------------------------------------------------------------*/ +/* Static function definitions (internal use only) */ + +/* {{{ Memory management */ + +/* {{{ s_mp_grow(mp, min) */ + +/* Make sure there are at least 'min' digits allocated to mp */ +mp_err s_mp_grow(mp_int *mp, mp_size min) +{ + if(min > ALLOC(mp)) { + mp_digit *tmp; + + /* Set min to next nearest default precision block size */ + min = ((min + (s_mp_defprec - 1)) / s_mp_defprec) * s_mp_defprec; + + if((tmp = s_mp_alloc(min, sizeof(mp_digit))) == NULL) + return MP_MEM; + + s_mp_copy(DIGITS(mp), tmp, USED(mp)); + +#if MP_CRYPTO + s_mp_setz(DIGITS(mp), ALLOC(mp)); +#endif + s_mp_free(DIGITS(mp)); + DIGITS(mp) = tmp; + ALLOC(mp) = min; + } + + return MP_OKAY; + +} /* end s_mp_grow() */ + +/* }}} */ + +/* {{{ s_mp_pad(mp, min) */ + +/* Make sure the used size of mp is at least 'min', growing if needed */ +mp_err s_mp_pad(mp_int *mp, mp_size min) +{ + if(min > USED(mp)) { + mp_err res; + + /* Make sure there is room to increase precision */ + if(min > ALLOC(mp) && (res = s_mp_grow(mp, min)) != MP_OKAY) + return res; + + /* Increase precision; should already be 0-filled */ + USED(mp) = min; + } + + return MP_OKAY; + +} /* end s_mp_pad() */ + +/* }}} */ + +/* {{{ s_mp_setz(dp, count) */ + +#if MP_MACRO == 0 +/* Set 'count' digits pointed to by dp to be zeroes */ +void s_mp_setz(mp_digit *dp, mp_size count) +{ +#if MP_MEMSET == 0 + int ix; + + for(ix = 0; ix < count; ix++) + dp[ix] = 0; +#else + memset(dp, 0, count * sizeof(mp_digit)); +#endif + +} /* end s_mp_setz() */ +#endif + +/* }}} */ + +/* {{{ s_mp_copy(sp, dp, count) */ + +#if MP_MACRO == 0 +/* Copy 'count' digits from sp to dp */ +void s_mp_copy(mp_digit *sp, mp_digit *dp, mp_size count) +{ +#if MP_MEMCPY == 0 + int ix; + + for(ix = 0; ix < count; ix++) + dp[ix] = sp[ix]; +#else + memcpy(dp, sp, count * sizeof(mp_digit)); +#endif + +} /* end s_mp_copy() */ +#endif + +/* }}} */ + +/* {{{ s_mp_alloc(nb, ni) */ + +#if MP_MACRO == 0 +/* Allocate ni records of nb bytes each, and return a pointer to that */ +void *s_mp_alloc(size_t nb, size_t ni) +{ + return calloc(nb, ni); + +} /* end s_mp_alloc() */ +#endif + +/* }}} */ + +/* {{{ s_mp_free(ptr) */ + +#if MP_MACRO == 0 +/* Free the memory pointed to by ptr */ +void s_mp_free(void *ptr) +{ + if(ptr) + free(ptr); + +} /* end s_mp_free() */ +#endif + +/* }}} */ + +/* {{{ s_mp_clamp(mp) */ + +/* Remove leading zeroes from the given value */ +void s_mp_clamp(mp_int *mp) +{ + mp_size du = USED(mp); + mp_digit *zp = DIGITS(mp) + du - 1; + + while(du > 1 && !*zp--) + --du; + + USED(mp) = du; + +} /* end s_mp_clamp() */ + + +/* }}} */ + +/* {{{ s_mp_exch(a, b) */ + +/* Exchange the data for a and b; (b, a) = (a, b) */ +void s_mp_exch(mp_int *a, mp_int *b) +{ + mp_int tmp; + + tmp = *a; + *a = *b; + *b = tmp; + +} /* end s_mp_exch() */ + +/* }}} */ + +/* }}} */ + +/* {{{ Arithmetic helpers */ + +/* {{{ s_mp_lshd(mp, p) */ + +/* + Shift mp leftward by p digits, growing if needed, and zero-filling + the in-shifted digits at the right end. This is a convenient + alternative to multiplication by powers of the radix + */ + +mp_err s_mp_lshd(mp_int *mp, mp_size p) +{ + mp_err res; + mp_size pos; + mp_digit *dp; + int ix; + + if(p == 0) + return MP_OKAY; + + if((res = s_mp_pad(mp, USED(mp) + p)) != MP_OKAY) + return res; + + pos = USED(mp) - 1; + dp = DIGITS(mp); + + /* Shift all the significant figures over as needed */ + for(ix = pos - p; ix >= 0; ix--) + dp[ix + p] = dp[ix]; + + /* Fill the bottom digits with zeroes */ + for(ix = 0; ix < p; ix++) + dp[ix] = 0; + + return MP_OKAY; + +} /* end s_mp_lshd() */ + +/* }}} */ + +/* {{{ s_mp_rshd(mp, p) */ + +/* + Shift mp rightward by p digits. Maintains the invariant that + digits above the precision are all zero. Digits shifted off the + end are lost. Cannot fail. + */ + +void s_mp_rshd(mp_int *mp, mp_size p) +{ + mp_size ix; + mp_digit *dp; + + if(p == 0) + return; + + /* Shortcut when all digits are to be shifted off */ + if(p >= USED(mp)) { + s_mp_setz(DIGITS(mp), ALLOC(mp)); + USED(mp) = 1; + SIGN(mp) = MP_ZPOS; + return; + } + + /* Shift all the significant figures over as needed */ + dp = DIGITS(mp); + for(ix = p; ix < USED(mp); ix++) + dp[ix - p] = dp[ix]; + + /* Fill the top digits with zeroes */ + ix -= p; + while(ix < USED(mp)) + dp[ix++] = 0; + + /* Strip off any leading zeroes */ + s_mp_clamp(mp); + +} /* end s_mp_rshd() */ + +/* }}} */ + +/* {{{ s_mp_div_2(mp) */ + +/* Divide by two -- take advantage of radix properties to do it fast */ +void s_mp_div_2(mp_int *mp) +{ + s_mp_div_2d(mp, 1); + +} /* end s_mp_div_2() */ + +/* }}} */ + +/* {{{ s_mp_mul_2(mp) */ + +mp_err s_mp_mul_2(mp_int *mp) +{ + int ix; + mp_digit kin = 0, kout, *dp = DIGITS(mp); + mp_err res; + + /* Shift digits leftward by 1 bit */ + for(ix = 0; ix < USED(mp); ix++) { + kout = (dp[ix] >> (DIGIT_BIT - 1)) & 1; + dp[ix] = (dp[ix] << 1) | kin; + + kin = kout; + } + + /* Deal with rollover from last digit */ + if(kin) { + if(ix >= ALLOC(mp)) { + if((res = s_mp_grow(mp, ALLOC(mp) + 1)) != MP_OKAY) + return res; + dp = DIGITS(mp); + } + + dp[ix] = kin; + USED(mp) += 1; + } + + return MP_OKAY; + +} /* end s_mp_mul_2() */ + +/* }}} */ + +/* {{{ s_mp_mod_2d(mp, d) */ + +/* + Remainder the integer by 2^d, where d is a number of bits. This + amounts to a bitwise AND of the value, and does not require the full + division code + */ +void s_mp_mod_2d(mp_int *mp, mp_digit d) +{ + unsigned int ndig = (d / DIGIT_BIT), nbit = (d % DIGIT_BIT); + unsigned int ix; + mp_digit dmask, *dp = DIGITS(mp); + + if(ndig >= USED(mp)) + return; + + /* Flush all the bits above 2^d in its digit */ + dmask = (1 << nbit) - 1; + dp[ndig] &= dmask; + + /* Flush all digits above the one with 2^d in it */ + for(ix = ndig + 1; ix < USED(mp); ix++) + dp[ix] = 0; + + s_mp_clamp(mp); + +} /* end s_mp_mod_2d() */ + +/* }}} */ + +/* {{{ s_mp_mul_2d(mp, d) */ + +/* + Multiply by the integer 2^d, where d is a number of bits. This + amounts to a bitwise shift of the value, and does not require the + full multiplication code. + */ +mp_err s_mp_mul_2d(mp_int *mp, mp_digit d) +{ + mp_err res; + mp_digit save, next, mask, *dp; + mp_size used; + int ix; + + if((res = s_mp_lshd(mp, d / DIGIT_BIT)) != MP_OKAY) + return res; + + dp = DIGITS(mp); used = USED(mp); + d %= DIGIT_BIT; + + mask = (1 << d) - 1; + + /* If the shift requires another digit, make sure we've got one to + work with */ + if((dp[used - 1] >> (DIGIT_BIT - d)) & mask) { + if((res = s_mp_grow(mp, used + 1)) != MP_OKAY) + return res; + dp = DIGITS(mp); + } + + /* Do the shifting... */ + save = 0; + for(ix = 0; ix < used; ix++) { + next = (dp[ix] >> (DIGIT_BIT - d)) & mask; + dp[ix] = (dp[ix] << d) | save; + save = next; + } + + /* If, at this point, we have a nonzero carryout into the next + digit, we'll increase the size by one digit, and store it... + */ + if(save) { + dp[used] = save; + USED(mp) += 1; + } + + s_mp_clamp(mp); + return MP_OKAY; + +} /* end s_mp_mul_2d() */ + +/* }}} */ + +/* {{{ s_mp_div_2d(mp, d) */ + +/* + Divide the integer by 2^d, where d is a number of bits. This + amounts to a bitwise shift of the value, and does not require the + full division code (used in Barrett reduction, see below) + */ +void s_mp_div_2d(mp_int *mp, mp_digit d) +{ + int ix; + mp_digit save, next, mask, *dp = DIGITS(mp); + + s_mp_rshd(mp, d / DIGIT_BIT); + d %= DIGIT_BIT; + + mask = (1 << d) - 1; + + save = 0; + for(ix = USED(mp) - 1; ix >= 0; ix--) { + next = dp[ix] & mask; + dp[ix] = (dp[ix] >> d) | (save << (DIGIT_BIT - d)); + save = next; + } + + s_mp_clamp(mp); + +} /* end s_mp_div_2d() */ + +/* }}} */ + +/* {{{ s_mp_norm(a, b) */ + +/* + s_mp_norm(a, b) + + Normalize a and b for division, where b is the divisor. In order + that we might make good guesses for quotient digits, we want the + leading digit of b to be at least half the radix, which we + accomplish by multiplying a and b by a constant. This constant is + returned (so that it can be divided back out of the remainder at the + end of the division process). + + We multiply by the smallest power of 2 that gives us a leading digit + at least half the radix. By choosing a power of 2, we simplify the + multiplication and division steps to simple shifts. + */ +mp_digit s_mp_norm(mp_int *a, mp_int *b) +{ + mp_digit t, d = 0; + + t = DIGIT(b, USED(b) - 1); + while(t < (RADIX / 2)) { + t <<= 1; + ++d; + } + + if(d != 0) { + s_mp_mul_2d(a, d); + s_mp_mul_2d(b, d); + } + + return d; + +} /* end s_mp_norm() */ + +/* }}} */ + +/* }}} */ + +/* {{{ Primitive digit arithmetic */ + +/* {{{ s_mp_add_d(mp, d) */ + +/* Add d to |mp| in place */ +mp_err s_mp_add_d(mp_int *mp, mp_digit d) /* unsigned digit addition */ +{ + mp_word w, k = 0; + mp_size ix = 1, used = USED(mp); + mp_digit *dp = DIGITS(mp); + + w = dp[0] + d; + dp[0] = ACCUM(w); + k = CARRYOUT(w); + + while(ix < used && k) { + w = dp[ix] + k; + dp[ix] = ACCUM(w); + k = CARRYOUT(w); + ++ix; + } + + if(k != 0) { + mp_err res; + + if((res = s_mp_pad(mp, USED(mp) + 1)) != MP_OKAY) + return res; + + DIGIT(mp, ix) = k; + } + + return MP_OKAY; + +} /* end s_mp_add_d() */ + +/* }}} */ + +/* {{{ s_mp_sub_d(mp, d) */ + +/* Subtract d from |mp| in place, assumes |mp| > d */ +mp_err s_mp_sub_d(mp_int *mp, mp_digit d) /* unsigned digit subtract */ +{ + mp_word w, b = 0; + mp_size ix = 1, used = USED(mp); + mp_digit *dp = DIGITS(mp); + + /* Compute initial subtraction */ + w = (RADIX + dp[0]) - d; + b = CARRYOUT(w) ? 0 : 1; + dp[0] = ACCUM(w); + + /* Propagate borrows leftward */ + while(b && ix < used) { + w = (RADIX + dp[ix]) - b; + b = CARRYOUT(w) ? 0 : 1; + dp[ix] = ACCUM(w); + ++ix; + } + + /* Remove leading zeroes */ + s_mp_clamp(mp); + + /* If we have a borrow out, it's a violation of the input invariant */ + if(b) + return MP_RANGE; + else + return MP_OKAY; + +} /* end s_mp_sub_d() */ + +/* }}} */ + +/* {{{ s_mp_mul_d(a, d) */ + +/* Compute a = a * d, single digit multiplication */ +mp_err s_mp_mul_d(mp_int *a, mp_digit d) +{ + mp_word w, k = 0; + mp_size ix, max; + mp_err res; + mp_digit *dp = DIGITS(a); + + /* + Single-digit multiplication will increase the precision of the + output by at most one digit. However, we can detect when this + will happen -- if the high-order digit of a, times d, gives a + two-digit result, then the precision of the result will increase; + otherwise it won't. We use this fact to avoid calling s_mp_pad() + unless absolutely necessary. + */ + max = USED(a); + w = dp[max - 1] * d; + if(CARRYOUT(w) != 0) { + if((res = s_mp_pad(a, max + 1)) != MP_OKAY) + return res; + dp = DIGITS(a); + } + + for(ix = 0; ix < max; ix++) { + w = (dp[ix] * d) + k; + dp[ix] = ACCUM(w); + k = CARRYOUT(w); + } + + /* If there is a precision increase, take care of it here; the above + test guarantees we have enough storage to do this safely. + */ + if(k) { + dp[max] = k; + USED(a) = max + 1; + } + + s_mp_clamp(a); + + return MP_OKAY; + +} /* end s_mp_mul_d() */ + +/* }}} */ + +/* {{{ s_mp_div_d(mp, d, r) */ + +/* + s_mp_div_d(mp, d, r) + + Compute the quotient mp = mp / d and remainder r = mp mod d, for a + single digit d. If r is null, the remainder will be discarded. + */ + +mp_err s_mp_div_d(mp_int *mp, mp_digit d, mp_digit *r) +{ + mp_word w = 0, t; + mp_int quot; + mp_err res; + mp_digit *dp = DIGITS(mp), *qp; + int ix; + + if(d == 0) + return MP_RANGE; + + /* Make room for the quotient */ + if((res = mp_init_size(", USED(mp))) != MP_OKAY) + return res; + + USED(") = USED(mp); /* so clamping will work below */ + qp = DIGITS("); + + /* Divide without subtraction */ + for(ix = USED(mp) - 1; ix >= 0; ix--) { + w = (w << DIGIT_BIT) | dp[ix]; + + if(w >= d) { + t = w / d; + w = w % d; + } else { + t = 0; + } + + qp[ix] = t; + } + + /* Deliver the remainder, if desired */ + if(r) + *r = w; + + s_mp_clamp("); + mp_exch(", mp); + mp_clear("); + + return MP_OKAY; + +} /* end s_mp_div_d() */ + +/* }}} */ + +/* }}} */ + +/* {{{ Primitive full arithmetic */ + +/* {{{ s_mp_add(a, b) */ + +/* Compute a = |a| + |b| */ +mp_err s_mp_add(mp_int *a, mp_int *b) /* magnitude addition */ +{ + mp_word w = 0; + mp_digit *pa, *pb; + mp_size ix, used = USED(b); + mp_err res; + + /* Make sure a has enough precision for the output value */ + if((used > USED(a)) && (res = s_mp_pad(a, used)) != MP_OKAY) + return res; + + /* + Add up all digits up to the precision of b. If b had initially + the same precision as a, or greater, we took care of it by the + padding step above, so there is no problem. If b had initially + less precision, we'll have to make sure the carry out is duly + propagated upward among the higher-order digits of the sum. + */ + pa = DIGITS(a); + pb = DIGITS(b); + for(ix = 0; ix < used; ++ix) { + w += *pa + *pb++; + *pa++ = ACCUM(w); + w = CARRYOUT(w); + } + + /* If we run out of 'b' digits before we're actually done, make + sure the carries get propagated upward... + */ + used = USED(a); + while(w && ix < used) { + w += *pa; + *pa++ = ACCUM(w); + w = CARRYOUT(w); + ++ix; + } + + /* If there's an overall carry out, increase precision and include + it. We could have done this initially, but why touch the memory + allocator unless we're sure we have to? + */ + if(w) { + if((res = s_mp_pad(a, used + 1)) != MP_OKAY) + return res; + + DIGIT(a, ix) = w; /* pa may not be valid after s_mp_pad() call */ + } + + return MP_OKAY; + +} /* end s_mp_add() */ + +/* }}} */ + +/* {{{ s_mp_sub(a, b) */ + +/* Compute a = |a| - |b|, assumes |a| >= |b| */ +mp_err s_mp_sub(mp_int *a, mp_int *b) /* magnitude subtract */ +{ + mp_word w = 0; + mp_digit *pa, *pb; + mp_size ix, used = USED(b); + + /* + Subtract and propagate borrow. Up to the precision of b, this + accounts for the digits of b; after that, we just make sure the + carries get to the right place. This saves having to pad b out to + the precision of a just to make the loops work right... + */ + pa = DIGITS(a); + pb = DIGITS(b); + + for(ix = 0; ix < used; ++ix) { + w = (RADIX + *pa) - w - *pb++; + *pa++ = ACCUM(w); + w = CARRYOUT(w) ? 0 : 1; + } + + used = USED(a); + while(ix < used) { + w = RADIX + *pa - w; + *pa++ = ACCUM(w); + w = CARRYOUT(w) ? 0 : 1; + ++ix; + } + + /* Clobber any leading zeroes we created */ + s_mp_clamp(a); + + /* + If there was a borrow out, then |b| > |a| in violation + of our input invariant. We've already done the work, + but we'll at least complain about it... + */ + if(w) + return MP_RANGE; + else + return MP_OKAY; + +} /* end s_mp_sub() */ + +/* }}} */ + +mp_err s_mp_reduce(mp_int *x, mp_int *m, mp_int *mu) +{ + mp_int q; + mp_err res; + mp_size um = USED(m); + + if((res = mp_init_copy(&q, x)) != MP_OKAY) + return res; + + s_mp_rshd(&q, um - 1); /* q1 = x / b^(k-1) */ + s_mp_mul(&q, mu); /* q2 = q1 * mu */ + s_mp_rshd(&q, um + 1); /* q3 = q2 / b^(k+1) */ + + /* x = x mod b^(k+1), quick (no division) */ + s_mp_mod_2d(x, (mp_digit)(DIGIT_BIT * (um + 1))); + + /* q = q * m mod b^(k+1), quick (no division), uses the short multiplier */ +#ifndef SHRT_MUL + s_mp_mul(&q, m); + s_mp_mod_2d(&q, (mp_digit)(DIGIT_BIT * (um + 1))); +#else + s_mp_mul_dig(&q, m, um + 1); +#endif + + /* x = x - q */ + if((res = mp_sub(x, &q, x)) != MP_OKAY) + goto CLEANUP; + + /* If x < 0, add b^(k+1) to it */ + if(mp_cmp_z(x) < 0) { + mp_set(&q, 1); + if((res = s_mp_lshd(&q, um + 1)) != MP_OKAY) + goto CLEANUP; + if((res = mp_add(x, &q, x)) != MP_OKAY) + goto CLEANUP; + } + + /* Back off if it's too big */ + while(mp_cmp(x, m) >= 0) { + if((res = s_mp_sub(x, m)) != MP_OKAY) + break; + } + + CLEANUP: + mp_clear(&q); + + return res; + +} /* end s_mp_reduce() */ + + + +/* {{{ s_mp_mul(a, b) */ + +/* Compute a = |a| * |b| */ +mp_err s_mp_mul(mp_int *a, mp_int *b) +{ + mp_word w, k = 0; + mp_int tmp; + mp_err res; + mp_size ix, jx, ua = USED(a), ub = USED(b); + mp_digit *pa, *pb, *pt, *pbt; + + if((res = mp_init_size(&tmp, ua + ub)) != MP_OKAY) + return res; + + /* This has the effect of left-padding with zeroes... */ + USED(&tmp) = ua + ub; + + /* We're going to need the base value each iteration */ + pbt = DIGITS(&tmp); + + /* Outer loop: Digits of b */ + + pb = DIGITS(b); + for(ix = 0; ix < ub; ++ix, ++pb) { + if(*pb == 0) + continue; + + /* Inner product: Digits of a */ + pa = DIGITS(a); + for(jx = 0; jx < ua; ++jx, ++pa) { + pt = pbt + ix + jx; + w = *pb * *pa + k + *pt; + *pt = ACCUM(w); + k = CARRYOUT(w); + } + + pbt[ix + jx] = k; + k = 0; + } + + s_mp_clamp(&tmp); + s_mp_exch(&tmp, a); + + mp_clear(&tmp); + + return MP_OKAY; + +} /* end s_mp_mul() */ + +/* }}} */ + +/* {{{ s_mp_kmul(a, b, out, len) */ + +#if 0 +void s_mp_kmul(mp_digit *a, mp_digit *b, mp_digit *out, mp_size len) +{ + mp_word w, k = 0; + mp_size ix, jx; + mp_digit *pa, *pt; + + for(ix = 0; ix < len; ++ix, ++b) { + if(*b == 0) + continue; + + pa = a; + for(jx = 0; jx < len; ++jx, ++pa) { + pt = out + ix + jx; + w = *b * *pa + k + *pt; + *pt = ACCUM(w); + k = CARRYOUT(w); + } + + out[ix + jx] = k; + k = 0; + } + +} /* end s_mp_kmul() */ +#endif + +/* }}} */ + +/* {{{ s_mp_sqr(a) */ + +/* + Computes the square of a, in place. This can be done more + efficiently than a general multiplication, because many of the + computation steps are redundant when squaring. The inner product + step is a bit more complicated, but we save a fair number of + iterations of the multiplication loop. + */ +#if MP_SQUARE +mp_err s_mp_sqr(mp_int *a) +{ + mp_word w, k = 0; + mp_int tmp; + mp_err res; + mp_size ix, jx, kx, used = USED(a); + mp_digit *pa1, *pa2, *pt, *pbt; + + if((res = mp_init_size(&tmp, 2 * used)) != MP_OKAY) + return res; + + /* Left-pad with zeroes */ + USED(&tmp) = 2 * used; + + /* We need the base value each time through the loop */ + pbt = DIGITS(&tmp); + + pa1 = DIGITS(a); + for(ix = 0; ix < used; ++ix, ++pa1) { + if(*pa1 == 0) + continue; + + w = DIGIT(&tmp, ix + ix) + (*pa1 * *pa1); + + pbt[ix + ix] = ACCUM(w); + k = CARRYOUT(w); + + /* + The inner product is computed as: + + (C, S) = t[i,j] + 2 a[i] a[j] + C + + This can overflow what can be represented in an mp_word, and + since C arithmetic does not provide any way to check for + overflow, we have to check explicitly for overflow conditions + before they happen. + */ + for(jx = ix + 1, pa2 = DIGITS(a) + jx; jx < used; ++jx, ++pa2) { + mp_word u = 0, v; + + /* Store this in a temporary to avoid indirections later */ + pt = pbt + ix + jx; + + /* Compute the multiplicative step */ + w = *pa1 * *pa2; + + /* If w is more than half MP_WORD_MAX, the doubling will + overflow, and we need to record a carry out into the next + word */ + u = (w >> (MP_WORD_BIT - 1)) & 1; + + /* Double what we've got, overflow will be ignored as defined + for C arithmetic (we've already noted if it is to occur) + */ + w *= 2; + + /* Compute the additive step */ + v = *pt + k; + + /* If we do not already have an overflow carry, check to see + if the addition will cause one, and set the carry out if so + */ + u |= ((MP_WORD_MAX - v) < w); + + /* Add in the rest, again ignoring overflow */ + w += v; + + /* Set the i,j digit of the output */ + *pt = ACCUM(w); + + /* Save carry information for the next iteration of the loop. + This is why k must be an mp_word, instead of an mp_digit */ + k = CARRYOUT(w) | (u << DIGIT_BIT); + + } /* for(jx ...) */ + + /* Set the last digit in the cycle and reset the carry */ + k = DIGIT(&tmp, ix + jx) + k; + pbt[ix + jx] = ACCUM(k); + k = CARRYOUT(k); + + /* If we are carrying out, propagate the carry to the next digit + in the output. This may cascade, so we have to be somewhat + circumspect -- but we will have enough precision in the output + that we won't overflow + */ + kx = 1; + while(k) { + k = pbt[ix + jx + kx] + 1; + pbt[ix + jx + kx] = ACCUM(k); + k = CARRYOUT(k); + ++kx; + } + } /* for(ix ...) */ + + s_mp_clamp(&tmp); + s_mp_exch(&tmp, a); + + mp_clear(&tmp); + + return MP_OKAY; + +} /* end s_mp_sqr() */ +#endif + +/* }}} */ + +/* {{{ s_mp_div(a, b) */ + +/* + s_mp_div(a, b) + + Compute a = a / b and b = a mod b. Assumes b > a. + */ + +mp_err s_mp_div(mp_int *a, mp_int *b) +{ + mp_int quot, rem, t; + mp_word q; + mp_err res; + mp_digit d; + int ix; + + if(mp_cmp_z(b) == 0) + return MP_RANGE; + + /* Shortcut if b is power of two */ + if((ix = s_mp_ispow2(b)) >= 0) { + mp_copy(a, b); /* need this for remainder */ + s_mp_div_2d(a, (mp_digit)ix); + s_mp_mod_2d(b, (mp_digit)ix); + + return MP_OKAY; + } + + /* Allocate space to store the quotient */ + if((res = mp_init_size(", USED(a))) != MP_OKAY) + return res; + + /* A working temporary for division */ + if((res = mp_init_size(&t, USED(a))) != MP_OKAY) + goto T; + + /* Allocate space for the remainder */ + if((res = mp_init_size(&rem, USED(a))) != MP_OKAY) + goto REM; + + /* Normalize to optimize guessing */ + d = s_mp_norm(a, b); + + /* Perform the division itself...woo! */ + ix = USED(a) - 1; + + while(ix >= 0) { + /* Find a partial substring of a which is at least b */ + while(s_mp_cmp(&rem, b) < 0 && ix >= 0) { + if((res = s_mp_lshd(&rem, 1)) != MP_OKAY) + goto CLEANUP; + + if((res = s_mp_lshd(", 1)) != MP_OKAY) + goto CLEANUP; + + DIGIT(&rem, 0) = DIGIT(a, ix); + s_mp_clamp(&rem); + --ix; + } + + /* If we didn't find one, we're finished dividing */ + if(s_mp_cmp(&rem, b) < 0) + break; + + /* Compute a guess for the next quotient digit */ + q = DIGIT(&rem, USED(&rem) - 1); + if(q <= DIGIT(b, USED(b) - 1) && USED(&rem) > 1) + q = (q << DIGIT_BIT) | DIGIT(&rem, USED(&rem) - 2); + + q /= DIGIT(b, USED(b) - 1); + + /* The guess can be as much as RADIX + 1 */ + if(q >= RADIX) + q = RADIX - 1; + + /* See what that multiplies out to */ + mp_copy(b, &t); + if((res = s_mp_mul_d(&t, q)) != MP_OKAY) + goto CLEANUP; + + /* + If it's too big, back it off. We should not have to do this + more than once, or, in rare cases, twice. Knuth describes a + method by which this could be reduced to a maximum of once, but + I didn't implement that here. + */ + while(s_mp_cmp(&t, &rem) > 0) { + --q; + s_mp_sub(&t, b); + } + + /* At this point, q should be the right next digit */ + if((res = s_mp_sub(&rem, &t)) != MP_OKAY) + goto CLEANUP; + + /* + Include the digit in the quotient. We allocated enough memory + for any quotient we could ever possibly get, so we should not + have to check for failures here + */ + DIGIT(", 0) = q; + } + + /* Denormalize remainder */ + if(d != 0) + s_mp_div_2d(&rem, d); + + s_mp_clamp("); + s_mp_clamp(&rem); + + /* Copy quotient back to output */ + s_mp_exch(", a); + + /* Copy remainder back to output */ + s_mp_exch(&rem, b); + +CLEANUP: + mp_clear(&rem); +REM: + mp_clear(&t); +T: + mp_clear("); + + return res; + +} /* end s_mp_div() */ + +/* }}} */ + +/* {{{ s_mp_2expt(a, k) */ + +mp_err s_mp_2expt(mp_int *a, mp_digit k) +{ + mp_err res; + mp_size dig, bit; + + dig = k / DIGIT_BIT; + bit = k % DIGIT_BIT; + + mp_zero(a); + if((res = s_mp_pad(a, dig + 1)) != MP_OKAY) + return res; + + DIGIT(a, dig) |= (1 << bit); + + return MP_OKAY; + +} /* end s_mp_2expt() */ + +/* }}} */ + + +/* }}} */ + +/* }}} */ + +/* {{{ Primitive comparisons */ + +/* {{{ s_mp_cmp(a, b) */ + +/* Compare |a| <=> |b|, return 0 if equal, <0 if a0 if a>b */ +int s_mp_cmp(mp_int *a, mp_int *b) +{ + mp_size ua = USED(a), ub = USED(b); + + if(ua > ub) + return MP_GT; + else if(ua < ub) + return MP_LT; + else { + int ix = ua - 1; + mp_digit *ap = DIGITS(a) + ix, *bp = DIGITS(b) + ix; + + while(ix >= 0) { + if(*ap > *bp) + return MP_GT; + else if(*ap < *bp) + return MP_LT; + + --ap; --bp; --ix; + } + + return MP_EQ; + } + +} /* end s_mp_cmp() */ + +/* }}} */ + +/* {{{ s_mp_cmp_d(a, d) */ + +/* Compare |a| <=> d, return 0 if equal, <0 if a0 if a>d */ +int s_mp_cmp_d(mp_int *a, mp_digit d) +{ + mp_size ua = USED(a); + mp_digit *ap = DIGITS(a); + + if(ua > 1) + return MP_GT; + + if(*ap < d) + return MP_LT; + else if(*ap > d) + return MP_GT; + else + return MP_EQ; + +} /* end s_mp_cmp_d() */ + +/* }}} */ + +/* {{{ s_mp_ispow2(v) */ + +/* + Returns -1 if the value is not a power of two; otherwise, it returns + k such that v = 2^k, i.e. lg(v). + */ +int s_mp_ispow2(mp_int *v) +{ + mp_digit d, *dp; + mp_size uv = USED(v); + int extra = 0, ix; + + d = DIGIT(v, uv - 1); /* most significant digit of v */ + + while(d && ((d & 1) == 0)) { + d >>= 1; + ++extra; + } + + if(d == 1) { + ix = uv - 2; + dp = DIGITS(v) + ix; + + while(ix >= 0) { + if(*dp) + return -1; /* not a power of two */ + + --dp; --ix; + } + + return ((uv - 1) * DIGIT_BIT) + extra; + } + + return -1; + +} /* end s_mp_ispow2() */ + +/* }}} */ + +/* {{{ s_mp_ispow2d(d) */ + +int s_mp_ispow2d(mp_digit d) +{ + int pow = 0; + + while((d & 1) == 0) { + ++pow; d >>= 1; + } + + if(d == 1) + return pow; + + return -1; + +} /* end s_mp_ispow2d() */ + +/* }}} */ + +/* }}} */ + +/* {{{ Primitive I/O helpers */ + +/* {{{ s_mp_tovalue(ch, r) */ + +/* + Convert the given character to its digit value, in the given radix. + If the given character is not understood in the given radix, -1 is + returned. Otherwise the digit's numeric value is returned. + + The results will be odd if you use a radix < 2 or > 62, you are + expected to know what you're up to. + */ +int s_mp_tovalue(char ch, int r) +{ + int val, xch; + + if(r > 36) + xch = ch; + else + xch = toupper(ch); + + if(isdigit(xch)) + val = xch - '0'; + else if(isupper(xch)) + val = xch - 'A' + 10; + else if(islower(xch)) + val = xch - 'a' + 36; + else if(xch == '+') + val = 62; + else if(xch == '/') + val = 63; + else + return -1; + + if(val < 0 || val >= r) + return -1; + + return val; + +} /* end s_mp_tovalue() */ + +/* }}} */ + +/* {{{ s_mp_todigit(val, r, low) */ + +/* + Convert val to a radix-r digit, if possible. If val is out of range + for r, returns zero. Otherwise, returns an ASCII character denoting + the value in the given radix. + + The results may be odd if you use a radix < 2 or > 64, you are + expected to know what you're doing. + */ + +char s_mp_todigit(int val, int r, int low) +{ + char ch; + + if(val < 0 || val >= r) + return 0; + + ch = s_dmap_1[val]; + + if(r <= 36 && low) + ch = tolower(ch); + + return ch; + +} /* end s_mp_todigit() */ + +/* }}} */ + +/* {{{ s_mp_outlen(bits, radix) */ + +/* + Return an estimate for how long a string is needed to hold a radix + r representation of a number with 'bits' significant bits. + + Does not include space for a sign or a NUL terminator. + */ +int s_mp_outlen(int bits, int r) +{ + return (int)((double)bits * LOG_V_2(r)); + +} /* end s_mp_outlen() */ + +/* }}} */ + +/* }}} */ + +/*------------------------------------------------------------------------*/ +/* HERE THERE BE DRAGONS */ +/* crc==4242132123, version==2, Sat Feb 02 06:43:52 2002 */ diff --git a/mtest/mtest.c b/mtest/mtest.c index 33ff215..2c24825 100644 --- a/mtest/mtest.c +++ b/mtest/mtest.c @@ -110,7 +110,7 @@ int main(void) t1 = clock(); for (;;) { if (clock() - t1 > CLOCKS_PER_SEC) { - sleep(1); + sleep(2); t1 = clock(); } diff --git a/pics/makefile~ b/pics/makefile~ deleted file mode 100644 index 4d9bd6b..0000000 --- a/pics/makefile~ +++ /dev/null @@ -1,35 +0,0 @@ -# makes the images... yeah - -default: pses - -design_process.ps: design_process.tif - tiff2ps -s -e design_process.tif > design_process.ps - -sliding_window.ps: sliding_window.tif - tiff2ps -e sliding_window.tif > sliding_window.ps - -expt_state.ps: expt_state.tif - tiff2ps -e expt_state.tif > expt_state.ps - -primality.ps: primality.tif - tiff2ps -e primality.tif > primality.ps - -design_process.pdf: design_process.ps - epstopdf design_process.ps - -sliding_window.pdf: sliding_window.ps - epstopdf sliding_window.ps - -expt_state.pdf: expt_state.ps - epstopdf expt_state.ps - -primality.pdf: primality.ps - epstopdf primality.ps - - -pses: sliding_window.ps expt_state.ps primality.ps design_process.ps -pdfes: sliding_window.pdf expt_state.pdf primality.pdf design_process.pdf - -clean: - rm -rf *.ps *.pdf .xvpics - \ No newline at end of file diff --git a/poster.pdf b/poster.pdf index dc71d8b9e4ffaa1ccd9a7fcb042cc5c32b6e2952..3731bd2bdaa53bb2052ef8258e5d97368b1b413c 100644 GIT binary patch delta 17001 zcmYhiQ*fYNw00ZYw$(8^wr$%T+j!HlZQHhOc5K_}Bpu^?|K9uJRIQ6qYt8#nPpxM@ z^@2V0g4M61L%)YXNr-p+YT83*1cx}C^YTtY!}fzxR9Du~5lc$J{)OT;@r}Va10_G0;Y^nDzK;Ktsf+aPU|G=5U5k<=_b{(bfPHQ&CV? zX=Y|>aJc1_!O;~oYEUTJ=)t``6qdEowO+YG&`yv+BP4v#T3aU=ihd3*TY)Yd2~lLg2Tgy7Cj=WOh9LZ4&IeJcMij5~i!W!Zkv7rXnWla#$cf}b#5rm|Oo`=>nEGXYkLx`Fs(%`NQ z2%^nMNVd{vgHY@#&tncvof}&mR3Ay$Z-&lk{efiQ+lUVzAr`{l3@t-$AmZii@wD%v zd>aP(co0SaNkgrFl-V5vG!LFY`!^0;04gH}Y`)Z19WJc!$O~40BpS3Qjf9rJoGiXk zDA^xpCrI6d-x*wB`U8EvNk!y%xTe;^kfkSF2_mHlpfiyK&%47xFa(Uh_0rq1GUS?G zJsDyFh#?ZOZdNf*gFI&B(Z!H_sc=!x50v9I%FvUQT$;FD{RP#6X3-s%moS93sv6|X z)hVdnl+(2Bb?jc#;>;GMj6SEK_Jwx;;REc#rBbap#D74Yldaq__`NmDaF`Job-%pIV>(`4don@ zw25}_NF-0cT5fv4YS|+M_@(bQ@4hn4uadA52g&oY&*WS1!3CSglFN%-jq64vc8{}Tz@n@?%a=C=rh!ZpMs6qYjq$xErX!PA?}DHX;MkaYYq+Io z7~@=ECl7CwZtXpK%&fX@Y8tvn;8ov0Uui$FB;}V~Byv=Z>v8!A&BLpCM^ ze%JoIJSfFr)1T|bB<4&$P>v1wQFU|kRPT^0aK7UBJ<{e9G??%r%-b=2ZmYh*eM_&> zwb}VLJhCv!rQ#&AXhXhvo344FOU?F^PLeJMGnbMLjTfAeYmSz%d@|1BQJzP_igOWJ ziga?czCX*y#Os8CxZ0&paq-oZMtkgR^jKRON4*%`SOw%~*AicA=PwMPs65Pi!kQ@! zskNu$f{2>EZV!!?BbQBvII@9lzGhukS3r%!Y$z5HC^sIMbiJ&XO>D6#i7F;hhM(GcEz0@db;pd>Yi zP_9;5wC+b9ZD!xUB&?oGi9Qj_i;kF`YRBLApW&Zk5tZF(ephxu7%K8l;z6qD1`Q7h zlw&u+yeS-r=g3-oZv5=d#$xJ{-akS!O5H>}XvCw&eh968m2A!emMko>ittD8W#7Jy za!eufr8KZUyYGzN#oo+GZek(?T<6hmyEECd_r?`4pEcB>YQAfN!PFV-(MT$Gt9OwK zeM{FroKNr41{)f%Z~y5mmf#_Mnj)*0h|YhBmbiott2n^v<=MXYwtCt)t!@TpK?(oZ zch=MyZJBDTvGXMcs;uJkJIYuXS6P>gt%`dom?=mToaNlEYjZm^ozCT{-4t>AzAN{x z*Zjp#EQ1*U8#MDBzts8`Q&AZAzmh!wPGz-A(~>=2Cv(XVJksRj&X~Ni2 z$i=x4+Q)Pxz#hIFX%<1(GL�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

K7pFV@-6XQq-Sv=BwwF$OVb0pvc@oDm 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 +static const int lnz[16] = { + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 +}; + /* Counts the number of lsbs which are zero before the first zero bit */ int mp_cnt_lsb(mp_int *a) { int x; - mp_digit q; + mp_digit q, qq; /* easy out */ if (mp_iszero(a) == 1) { @@ -1362,11 +1365,13 @@ int mp_cnt_lsb(mp_int *a) x *= DIGIT_BIT; /* now scan this digit until a 1 is found */ - while ((q & 1) == 0) { - q >>= 1; - x += 1; + if ((q & 1) == 0) { + do { + qq = q & 15; + x += lnz[qq]; + q >>= 4; + } while (qq == 0); } - return x; } @@ -2665,75 +2670,75 @@ __M: /* End: bn_mp_exptmod_fast.c */ /* Start: bn_mp_exteuclid.c */ -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is a library that provides multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library was designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* Extended euclidean algorithm of (a, b) produces - a*u1 + b*u2 = u3 - */ -int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3) -{ - mp_int u1,u2,u3,v1,v2,v3,t1,t2,t3,q,tmp; - int err; - - if ((err = mp_init_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL)) != MP_OKAY) { - return err; - } - - /* initialize, (u1,u2,u3) = (1,0,a) */ - mp_set(&u1, 1); - if ((err = mp_copy(a, &u3)) != MP_OKAY) { goto _ERR; } - - /* initialize, (v1,v2,v3) = (0,1,b) */ - mp_set(&v2, 1); - if ((err = mp_copy(b, &v3)) != MP_OKAY) { goto _ERR; } - - /* loop while v3 != 0 */ - while (mp_iszero(&v3) == MP_NO) { - /* q = u3/v3 */ - if ((err = mp_div(&u3, &v3, &q, NULL)) != MP_OKAY) { goto _ERR; } - - /* (t1,t2,t3) = (u1,u2,u3) - (v1,v2,v3)q */ - if ((err = mp_mul(&v1, &q, &tmp)) != MP_OKAY) { goto _ERR; } - if ((err = mp_sub(&u1, &tmp, &t1)) != MP_OKAY) { goto _ERR; } - if ((err = mp_mul(&v2, &q, &tmp)) != MP_OKAY) { goto _ERR; } - if ((err = mp_sub(&u2, &tmp, &t2)) != MP_OKAY) { goto _ERR; } - if ((err = mp_mul(&v3, &q, &tmp)) != MP_OKAY) { goto _ERR; } - if ((err = mp_sub(&u3, &tmp, &t3)) != MP_OKAY) { goto _ERR; } - - /* (u1,u2,u3) = (v1,v2,v3) */ - if ((err = mp_copy(&v1, &u1)) != MP_OKAY) { goto _ERR; } - if ((err = mp_copy(&v2, &u2)) != MP_OKAY) { goto _ERR; } - if ((err = mp_copy(&v3, &u3)) != MP_OKAY) { goto _ERR; } - - /* (v1,v2,v3) = (t1,t2,t3) */ - if ((err = mp_copy(&t1, &v1)) != MP_OKAY) { goto _ERR; } - if ((err = mp_copy(&t2, &v2)) != MP_OKAY) { goto _ERR; } - if ((err = mp_copy(&t3, &v3)) != MP_OKAY) { goto _ERR; } - } - - /* copy result out */ - if (U1 != NULL) { mp_exch(U1, &u1); } - if (U2 != NULL) { mp_exch(U2, &u2); } - if (U3 != NULL) { mp_exch(U3, &u3); } - - err = MP_OKAY; -_ERR: mp_clear_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL); - return err; -} +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Extended euclidean algorithm of (a, b) produces + a*u1 + b*u2 = u3 + */ +int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3) +{ + mp_int u1,u2,u3,v1,v2,v3,t1,t2,t3,q,tmp; + int err; + + if ((err = mp_init_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL)) != MP_OKAY) { + return err; + } + + /* initialize, (u1,u2,u3) = (1,0,a) */ + mp_set(&u1, 1); + if ((err = mp_copy(a, &u3)) != MP_OKAY) { goto _ERR; } + + /* initialize, (v1,v2,v3) = (0,1,b) */ + mp_set(&v2, 1); + if ((err = mp_copy(b, &v3)) != MP_OKAY) { goto _ERR; } + + /* loop while v3 != 0 */ + while (mp_iszero(&v3) == MP_NO) { + /* q = u3/v3 */ + if ((err = mp_div(&u3, &v3, &q, NULL)) != MP_OKAY) { goto _ERR; } + + /* (t1,t2,t3) = (u1,u2,u3) - (v1,v2,v3)q */ + if ((err = mp_mul(&v1, &q, &tmp)) != MP_OKAY) { goto _ERR; } + if ((err = mp_sub(&u1, &tmp, &t1)) != MP_OKAY) { goto _ERR; } + if ((err = mp_mul(&v2, &q, &tmp)) != MP_OKAY) { goto _ERR; } + if ((err = mp_sub(&u2, &tmp, &t2)) != MP_OKAY) { goto _ERR; } + if ((err = mp_mul(&v3, &q, &tmp)) != MP_OKAY) { goto _ERR; } + if ((err = mp_sub(&u3, &tmp, &t3)) != MP_OKAY) { goto _ERR; } + + /* (u1,u2,u3) = (v1,v2,v3) */ + if ((err = mp_copy(&v1, &u1)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&v2, &u2)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&v3, &u3)) != MP_OKAY) { goto _ERR; } + + /* (v1,v2,v3) = (t1,t2,t3) */ + if ((err = mp_copy(&t1, &v1)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&t2, &v2)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&t3, &v3)) != MP_OKAY) { goto _ERR; } + } + + /* copy result out */ + if (U1 != NULL) { mp_exch(U1, &u1); } + if (U2 != NULL) { mp_exch(U2, &u2); } + if (U3 != NULL) { mp_exch(U3, &u3); } + + err = MP_OKAY; +_ERR: mp_clear_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL); + return err; +} /* End: bn_mp_exteuclid.c */ @@ -2828,7 +2833,7 @@ int mp_fwrite(mp_int *a, int radix, FILE *stream) return err; } - buf = XMALLOC (len); + buf = OPT_CAST(char) XMALLOC (len); if (buf == NULL) { return MP_MEM; } @@ -2963,6 +2968,49 @@ __U:mp_clear (&v); /* End: bn_mp_gcd.c */ +/* Start: bn_mp_get_int.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* get the lower 32-bits of an mp_int */ +unsigned long mp_get_int(mp_int * a) +{ + int i; + unsigned long res; + + if (a->used == 0) { + return 0; + } + + /* get number of digits of the lsb we have to read */ + i = MIN(a->used,(int)((sizeof(unsigned long)*CHAR_BIT+DIGIT_BIT-1)/DIGIT_BIT))-1; + + /* get most significant digit of result */ + res = DIGIT(a,i); + + while (--i >= 0) { + res = (res << DIGIT_BIT) | DIGIT(a,i); + } + + /* force result to 32-bits always so it is consistent on non 32-bit platforms */ + return res & 0xFFFFFFFFUL; +} + +/* End: bn_mp_get_int.c */ + /* Start: bn_mp_grow.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * @@ -2997,7 +3045,7 @@ int mp_grow (mp_int * a, int size) * in case the operation failed we don't want * to overwrite the dp member of a. */ - tmp = OPT_CAST XREALLOC (a->dp, sizeof (mp_digit) * size); + tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * size); if (tmp == NULL) { /* reallocation failed but "a" is still valid [can be freed] */ return MP_MEM; @@ -3039,7 +3087,7 @@ int mp_grow (mp_int * a, int size) int mp_init (mp_int * a) { /* allocate memory required and clear it */ - a->dp = OPT_CAST XCALLOC (sizeof (mp_digit), MP_PREC); + a->dp = OPT_CAST(mp_digit) XCALLOC (sizeof (mp_digit), MP_PREC); if (a->dp == NULL) { return MP_MEM; } @@ -3142,6 +3190,65 @@ int mp_init_multi(mp_int *mp, ...) /* End: bn_mp_init_multi.c */ +/* Start: bn_mp_init_set.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* initialize and set a digit */ +int mp_init_set (mp_int * a, mp_digit b) +{ + int err; + if ((err = mp_init(a)) != MP_OKAY) { + return err; + } + mp_set(a, b); + return err; +} + +/* End: bn_mp_init_set.c */ + +/* Start: bn_mp_init_set_int.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* initialize and set a digit */ +int mp_init_set_int (mp_int * a, unsigned long b) +{ + int err; + if ((err = mp_init(a)) != MP_OKAY) { + return err; + } + return mp_set_int(a, b); +} + +/* End: bn_mp_init_set_int.c */ + /* Start: bn_mp_init_size.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * @@ -3166,7 +3273,7 @@ int mp_init_size (mp_int * a, int size) size += (MP_PREC * 2) - (size % MP_PREC); /* alloc mem */ - a->dp = OPT_CAST XCALLOC (sizeof (mp_digit), size); + a->dp = OPT_CAST(mp_digit) XCALLOC (sizeof (mp_digit), size); if (a->dp == NULL) { return MP_MEM; } @@ -3357,6 +3464,113 @@ __ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); /* End: bn_mp_invmod.c */ +/* Start: bn_mp_is_square.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Check if remainders are possible squares - fast exclude non-squares */ +static const char rem_128[128] = { + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 +}; + +static const char rem_105[105] = { + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 +}; + +/* Store non-zero to ret if arg is square, and zero if not */ +int mp_is_square(mp_int *arg,int *ret) +{ + int res; + mp_digit c; + mp_int t; + unsigned long r; + + /* Default to Non-square :) */ + *ret = MP_NO; + + if (arg->sign == MP_NEG) { + return MP_VAL; + } + + /* digits used? (TSD) */ + if (arg->used == 0) { + return MP_OKAY; + } + + /* First check mod 128 (suppose that DIGIT_BIT is at least 7) */ + if (rem_128[127 & DIGIT(arg,0)] == 1) { + return MP_OKAY; + } + + /* Next check mod 105 (3*5*7) */ + if ((res = mp_mod_d(arg,105,&c)) != MP_OKAY) { + return res; + } + if (rem_105[c] == 1) { + return MP_OKAY; + } + + /* product of primes less than 2^31 */ + if ((res = mp_init_set_int(&t,11L*13L*17L*19L*23L*29L*31L)) != MP_OKAY) { + return res; + } + if ((res = mp_mod(arg,&t,&t)) != MP_OKAY) { + goto ERR; + } + r = mp_get_int(&t); + /* Check for other prime modules, note it's not an ERROR but we must + * free "t" so the easiest way is to goto ERR. We know that res + * is already equal to MP_OKAY from the mp_mod call + */ + if ( (1L<<(r%11)) & 0x5C4L ) goto ERR; + if ( (1L<<(r%13)) & 0x9E4L ) goto ERR; + if ( (1L<<(r%17)) & 0x5CE8L ) goto ERR; + if ( (1L<<(r%19)) & 0x4F50CL ) goto ERR; + if ( (1L<<(r%23)) & 0x7ACCA0L ) goto ERR; + if ( (1L<<(r%29)) & 0xC2EDD0CL ) goto ERR; + if ( (1L<<(r%31)) & 0x6DE2B848L ) goto ERR; + + /* Final check - is sqr(sqrt(arg)) == arg ? */ + if ((res = mp_sqrt(arg,&t)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sqr(&t,&t)) != MP_OKAY) { + goto ERR; + } + + *ret = (mp_cmp_mag(&t,arg) == MP_EQ) ? MP_YES : MP_NO; +ERR:mp_clear(&t); + return res; +} + +/* End: bn_mp_is_square.c */ + /* Start: bn_mp_jacobi.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * @@ -3506,8 +3720,7 @@ __A1:mp_clear (&a1); * Generally though the overhead of this method doesn't pay off * until a certain size (N ~ 80) is reached. */ -int -mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) +int mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) { mp_int x0, x1, y0, y1, t1, x0y0, x1y1; int B, err; @@ -3519,7 +3732,7 @@ mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) B = MIN (a->used, b->used); /* now divide in two */ - B = B / 2; + B = B >> 1; /* init copy all the temps */ if (mp_init_size (&x0, B) != MP_OKAY) @@ -3653,8 +3866,7 @@ ERR: * is essentially the same algorithm but merely * tuned to perform recursive squarings. */ -int -mp_karatsuba_sqr (mp_int * a, mp_int * b) +int mp_karatsuba_sqr (mp_int * a, mp_int * b) { mp_int x0, x1, t1, t2, x0x0, x1x1; int B, err; @@ -3665,7 +3877,7 @@ mp_karatsuba_sqr (mp_int * a, mp_int * b) B = a->used; /* now divide in two */ - B = B / 2; + B = B >> 1; /* init copy all the temps */ if (mp_init_size (&x0, B) != MP_OKAY) @@ -3896,7 +4108,6 @@ mp_mod (mp_int * a, mp_int * b, mp_int * c) mp_int t; int res; - if ((res = mp_init (&t)) != MP_OKAY) { return res; } @@ -3906,7 +4117,7 @@ mp_mod (mp_int * a, mp_int * b, mp_int * c) return res; } - if (t.sign == MP_NEG) { + if (t.sign != b->sign) { res = mp_add (b, &t, c); } else { res = MP_OKAY; @@ -4661,7 +4872,7 @@ int mp_n_root (mp_int * a, mp_digit b, mp_int * c) if (mp_cmp (&t2, a) == MP_GT) { if ((res = mp_sub_d (&t1, 1, &t1)) != MP_OKAY) { - goto __T3; + goto __T3; } } else { break; @@ -4711,7 +4922,7 @@ int mp_neg (mp_int * a, mp_int * b) if ((res = mp_copy (a, b)) != MP_OKAY) { return res; } - if (mp_iszero(b) != 1) { + if (mp_iszero(b) != MP_YES) { b->sign = (a->sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; } return MP_OKAY; @@ -5225,7 +5436,7 @@ __ERR: /* End: bn_mp_prime_next_prime.c */ -/* Start: bn_mp_prime_random.c */ +/* Start: bn_mp_prime_random_ex.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision @@ -5242,57 +5453,101 @@ __ERR: */ #include -/* makes a truly random prime of a given size (bytes), - * call with bbs = 1 if you want it to be congruent to 3 mod 4 +/* makes a truly random prime of a given size (bits), + * + * Flags are as follows: + * + * LTM_PRIME_BBS - make prime congruent to 3 mod 4 + * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) + * LTM_PRIME_2MSB_OFF - make the 2nd highest bit zero + * LTM_PRIME_2MSB_ON - make the 2nd highest bit one * * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself * so it can be NULL * - * The prime generated will be larger than 2^(8*size). */ -/* this sole function may hold the key to enslaving all mankind! */ -int mp_prime_random(mp_int *a, int t, int size, int bbs, ltm_prime_callback cb, void *dat) +/* This is possibly the mother of all prime generation functions, muahahahahaha! */ +int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat) { - unsigned char *tmp; - int res, err; + unsigned char *tmp, maskAND, maskOR_msb, maskOR_lsb; + int res, err, bsize, maskOR_msb_offset; /* sanity check the input */ - if (size <= 0) { + if (size <= 1 || t <= 0) { return MP_VAL; } - /* we need a buffer of size+1 bytes */ - tmp = XMALLOC(size+1); + /* LTM_PRIME_SAFE implies LTM_PRIME_BBS */ + if (flags & LTM_PRIME_SAFE) { + flags |= LTM_PRIME_BBS; + } + + /* calc the byte size */ + bsize = (size>>3)+(size&7?1:0); + + /* we need a buffer of bsize bytes */ + tmp = OPT_CAST(unsigned char) XMALLOC(bsize); if (tmp == NULL) { return MP_MEM; } - /* fix MSB */ - tmp[0] = 1; + /* calc the maskAND value for the MSbyte*/ + maskAND = 0xFF >> (8 - (size & 7)); + + /* calc the maskOR_msb */ + maskOR_msb = 0; + maskOR_msb_offset = (size - 2) >> 3; + if (flags & LTM_PRIME_2MSB_ON) { + maskOR_msb |= 1 << ((size - 2) & 7); + } else if (flags & LTM_PRIME_2MSB_OFF) { + maskAND &= ~(1 << ((size - 2) & 7)); + } + + /* get the maskOR_lsb */ + maskOR_lsb = 0; + if (flags & LTM_PRIME_BBS) { + maskOR_lsb |= 3; + } do { /* read the bytes */ - if (cb(tmp+1, size, dat) != size) { + if (cb(tmp, bsize, dat) != bsize) { err = MP_VAL; goto error; } - /* fix the LSB */ - tmp[size] |= (bbs ? 3 : 1); + /* work over the MSbyte */ + tmp[0] &= maskAND; + tmp[0] |= 1 << ((size - 1) & 7); + + /* mix in the maskORs */ + tmp[maskOR_msb_offset] |= maskOR_msb; + tmp[bsize-1] |= maskOR_lsb; /* read it in */ - if ((err = mp_read_unsigned_bin(a, tmp, size+1)) != MP_OKAY) { - goto error; - } + if ((err = mp_read_unsigned_bin(a, tmp, bsize)) != MP_OKAY) { goto error; } /* is it prime? */ - if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { - goto error; + if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } + + if (flags & LTM_PRIME_SAFE) { + /* see if (a-1)/2 is prime */ + if ((err = mp_sub_d(a, 1, a)) != MP_OKAY) { goto error; } + if ((err = mp_div_2(a, a)) != MP_OKAY) { goto error; } + + /* is it prime? */ + if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } } } while (res == MP_NO); + if (flags & LTM_PRIME_SAFE) { + /* restore a to the original value */ + if ((err = mp_mul_2(a, a)) != MP_OKAY) { goto error; } + if ((err = mp_add_d(a, 1, a)) != MP_OKAY) { goto error; } + } + err = MP_OKAY; error: XFREE(tmp); @@ -5301,7 +5556,7 @@ error: -/* End: bn_mp_prime_random.c */ +/* End: bn_mp_prime_random_ex.c */ /* Start: bn_mp_radix_size.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis @@ -5726,9 +5981,9 @@ CLEANUP: */ #include -/* reduces a modulo n where n is of the form 2**p - k */ +/* reduces a modulo n where n is of the form 2**p - d */ int -mp_reduce_2k(mp_int *a, mp_int *n, mp_digit k) +mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d) { mp_int q; int p, res; @@ -5744,9 +5999,9 @@ top: goto ERR; } - if (k != 1) { - /* q = q * k */ - if ((res = mp_mul_d(&q, k, &q)) != MP_OKAY) { + if (d != 1) { + /* q = q * d */ + if ((res = mp_mul_d(&q, d, &q)) != MP_OKAY) { goto ERR; } } @@ -6062,7 +6317,7 @@ int mp_shrink (mp_int * a) { mp_digit *tmp; if (a->alloc != a->used && a->used > 0) { - if ((tmp = OPT_CAST XREALLOC (a->dp, sizeof (mp_digit) * a->used)) == NULL) { + if ((tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * a->used)) == NULL) { return MP_MEM; } a->dp = tmp; @@ -6182,6 +6437,85 @@ mp_sqrmod (mp_int * a, mp_int * b, mp_int * c) /* End: bn_mp_sqrmod.c */ +/* Start: bn_mp_sqrt.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* this function is less generic than mp_n_root, simpler and faster */ +int mp_sqrt(mp_int *arg, mp_int *ret) +{ + int res; + mp_int t1,t2; + + /* must be positive */ + if (arg->sign == MP_NEG) { + return MP_VAL; + } + + /* easy out */ + if (mp_iszero(arg) == MP_YES) { + mp_zero(ret); + return MP_OKAY; + } + + if ((res = mp_init_copy(&t1, arg)) != MP_OKAY) { + return res; + } + + if ((res = mp_init(&t2)) != MP_OKAY) { + goto E2; + } + + /* First approx. (not very bad for large arg) */ + mp_rshd (&t1,t1.used/2); + + /* t1 > 0 */ + if ((res = mp_div(arg,&t1,&t2,NULL)) != MP_OKAY) { + goto E1; + } + if ((res = mp_add(&t1,&t2,&t1)) != MP_OKAY) { + goto E1; + } + if ((res = mp_div_2(&t1,&t1)) != MP_OKAY) { + goto E1; + } + /* And now t1 > sqrt(arg) */ + do { + if ((res = mp_div(arg,&t1,&t2,NULL)) != MP_OKAY) { + goto E1; + } + if ((res = mp_add(&t1,&t2,&t1)) != MP_OKAY) { + goto E1; + } + if ((res = mp_div_2(&t1,&t1)) != MP_OKAY) { + goto E1; + } + /* t1 >= sqrt(arg) >= t2 at this point */ + } while (mp_cmp_mag(&t1,&t2) == MP_GT); + + mp_exch(&t1,ret); + +E1: mp_clear(&t2); +E2: mp_clear(&t1); + return res; +} + + +/* End: bn_mp_sqrt.c */ + /* Start: bn_mp_sub.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * @@ -6463,8 +6797,7 @@ mp_to_unsigned_bin (mp_int * a, unsigned char *b) #include /* multiplication using the Toom-Cook 3-way algorithm */ -int -mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) +int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) { mp_int w0, w1, w2, w3, w4, tmp1, tmp2, a0, a1, a2, b0, b1, b2; int res, B; @@ -7019,6 +7352,93 @@ int mp_toradix (mp_int * a, char *str, int radix) /* End: bn_mp_toradix.c */ +/* Start: bn_mp_toradix_n.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* stores a bignum as a ASCII string in a given radix (2..64) + * + * Stores upto maxlen-1 chars and always a NULL byte + */ +int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen) +{ + int res, digs; + mp_int t; + mp_digit d; + char *_s = str; + + /* check range of the maxlen, radix */ + if (maxlen < 3 || radix < 2 || radix > 64) { + return MP_VAL; + } + + /* quick out if its zero */ + if (mp_iszero(a) == 1) { + *str++ = '0'; + *str = '\0'; + return MP_OKAY; + } + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + /* if it is negative output a - */ + if (t.sign == MP_NEG) { + /* we have to reverse our digits later... but not the - sign!! */ + ++_s; + + /* store the flag and mark the number as positive */ + *str++ = '-'; + t.sign = MP_ZPOS; + + /* subtract a char */ + --maxlen; + } + + digs = 0; + while (mp_iszero (&t) == 0) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return res; + } + *str++ = mp_s_rmap[d]; + ++digs; + + if (--maxlen == 1) { + /* no more room */ + break; + } + } + + /* reverse the digits of the string. In this case _s points + * to the first digit [exluding the sign] of the number] + */ + bn_reverse ((unsigned char *)_s, digs); + + /* append a NULL so the string is properly terminated */ + *str = '\0'; + + mp_clear (&t); + return MP_OKAY; +} + + +/* End: bn_mp_toradix_n.c */ + /* Start: bn_mp_unsigned_bin_size.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * @@ -7814,8 +8234,8 @@ s_mp_sqr (mp_int * a, mp_int * b) pa = a->used; if ((res = mp_init_size (&t, 2*pa + 1)) != MP_OKAY) { return res; - } - + } + /* default used is maximum possible size */ t.used = 2*pa + 1; diff --git a/tommath.h b/tommath.h index 6cc9bb0..0029994 100644 --- a/tommath.h +++ b/tommath.h @@ -30,12 +30,12 @@ extern "C" { /* C++ compilers don't like assigning void * to mp_digit * */ -#define OPT_CAST (mp_digit *) +#define OPT_CAST(x) (x *) #else /* C on the other hand doesn't care */ -#define OPT_CAST +#define OPT_CAST(x) #endif @@ -99,13 +99,13 @@ extern "C" { #define XFREE free #define XREALLOC realloc #define XCALLOC calloc + #else + /* prototypes for our heap functions */ + extern void *XMALLOC(size_t n); + extern void *REALLOC(void *p, size_t n); + extern void *XCALLOC(size_t n, size_t s); + extern void XFREE(void *p); #endif - - /* prototypes for our heap functions */ - extern void *XMALLOC(size_t n); - extern void *REALLOC(void *p, size_t n); - extern void *XCALLOC(size_t n, size_t s); - extern void XFREE(void *p); #endif @@ -134,6 +134,12 @@ extern "C" { #define MP_YES 1 /* yes response */ #define MP_NO 0 /* no response */ +/* Primality generation flags */ +#define LTM_PRIME_BBS 0x0001 /* BBS style prime */ +#define LTM_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */ +#define LTM_PRIME_2MSB_OFF 0x0004 /* force 2nd MSB to 0 */ +#define LTM_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */ + typedef int mp_err; /* you'll have to tune these... */ @@ -142,12 +148,18 @@ extern int KARATSUBA_MUL_CUTOFF, TOOM_MUL_CUTOFF, TOOM_SQR_CUTOFF; -/* various build options */ -#define MP_PREC 64 /* default digits of precision */ - /* define this to use lower memory usage routines (exptmods mostly) */ /* #define MP_LOW_MEM */ +/* default precision */ +#ifndef MP_PREC + #ifdef MP_LOW_MEM + #define MP_PREC 64 /* default digits of precision */ + #else + #define MP_PREC 8 /* default digits of precision */ + #endif +#endif + /* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */ #define MP_WARRAY (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1)) @@ -207,6 +219,15 @@ void mp_set(mp_int *a, mp_digit b); /* set a 32-bit const */ int mp_set_int(mp_int *a, unsigned long b); +/* get a 32-bit value */ +unsigned long mp_get_int(mp_int * a); + +/* initialize and set a digit */ +int mp_init_set (mp_int * a, mp_digit b); + +/* initialize and set 32-bit value */ +int mp_init_set_int (mp_int * a, unsigned long b); + /* copy, b = a */ int mp_copy(mp_int *a, mp_int *b); @@ -350,8 +371,11 @@ int mp_lcm(mp_int *a, mp_int *b, mp_int *c); */ int mp_n_root(mp_int *a, mp_digit b, mp_int *c); -/* shortcut for square root */ -#define mp_sqrt(a, b) mp_n_root(a, 2, b) +/* special sqrt algo */ +int mp_sqrt(mp_int *arg, mp_int *ret); + +/* is number a square? */ +int mp_is_square(mp_int *arg, int *ret); /* computes the jacobi c = (a | n) (or Legendre if b is prime) */ int mp_jacobi(mp_int *a, mp_int *n, int *c); @@ -393,7 +417,7 @@ int mp_reduce_is_2k(mp_int *a); int mp_reduce_2k_setup(mp_int *a, mp_digit *d); /* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ -int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit k); +int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d); /* d = a**b (mod c) */ int mp_exptmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); @@ -453,8 +477,23 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style); * * The prime generated will be larger than 2^(8*size). */ -int mp_prime_random(mp_int *a, int t, int size, int bbs, ltm_prime_callback cb, void *dat); +#define mp_prime_random(a, t, size, bbs, cb, dat) mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?LTM_PRIME_BBS:0, cb, dat) +/* makes a truly random prime of a given size (bits), + * + * Flags are as follows: + * + * LTM_PRIME_BBS - make prime congruent to 3 mod 4 + * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) + * LTM_PRIME_2MSB_OFF - make the 2nd highest bit zero + * LTM_PRIME_2MSB_ON - make the 2nd highest bit one + * + * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can + * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself + * so it can be NULL + * + */ +int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat); /* ---> radix conversion <--- */ int mp_count_bits(mp_int *a); @@ -469,6 +508,7 @@ int mp_to_signed_bin(mp_int *a, unsigned char *b); int mp_read_radix(mp_int *a, char *str, int radix); int mp_toradix(mp_int *a, char *str, int radix); +int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen); int mp_radix_size(mp_int *a, int radix, int *size); int mp_fread(mp_int *a, int radix, FILE *stream); diff --git a/tommath.pdf b/tommath.pdf index 08d658bc7d554e85dc783140b1c34d0bfe1115b7..fc3301a306fc0e63f9012d97b879bbed326ebf54 100644 GIT binary patch literal 1153705 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

oK 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