#!perl # require 'bigl.perl'; package DSA; # public parameters: p, q, g # private: x sub set_params { # p, q, g, x, k ($P,$Q,$G,$X,$K) = @_; $Y = &'bexpmod($G,$X,$P); } sub choose_random { $K; } sub generate_signature { # h = H(m) local($h) = @_; local($k,$r,$T1,$T2,$s); ($'GENstart) = times; $k = &choose_random(); # (g^k mod p) mod q $r = &'bmod(&'bexpmod($G,$k,$P),$Q); # (h + xr) mod q $T1 = &'badd(&'bmul($X,$r),$h); # k^-1 mod q = $T2 = &'binv($K,$Q); # s = (k^-1 (h + xr)) mod q = $s = &'bmod(&'bmul($T2,$T1),$Q); ($'GENend) = times; ($r, $s); } ########## end specific stuff for GENERATION sub verify_signature { # local($r,$s,$h) = @_; local($w,$u1,$u2,$T6,$T7,$v); ($'VERstart) = times; # w = s^-1 mod q $w = &'binv($s,$Q); # u1 = (hw) mod q $u1 = &'bmod(&'bmul($h,$w),$Q); # u2 = (rw) mod q $u2 = &'bmod(&'bmul($r,$w),$Q); # g^(u1) mod p $T6 = &'bexpmod($G,$u1,$P); # y^(u2) mod p = $T7 = &'bexpmod($Y,$u2,$P); # v = ((g^(u1) mod p)(y^(u2) mod p) mod p) mod q = $v = &'bmod(&'bmod(&'bmul($T6,$T7),$P),$Q); ($'VERend) = times; $v; }