X-Git-Url: http://www.git.cypherpunks.ru/?p=pygost.git;a=blobdiff_plain;f=pygost%2Fgost3410.py;fp=pygost%2Fgost3410.py;h=c12b17003a296d2299bd217fa8c4335e5793e634;hp=cdb5b039eb1dd876604c74d4c63135721c1a3fd5;hb=b529ed29328fafc3061c6b83358e3ee03b343189;hpb=b9ccf524fdce4b77dab1aa8020b09d7c7e1e55af diff --git a/pygost/gost3410.py b/pygost/gost3410.py index cdb5b03..c12b170 100644 --- a/pygost/gost3410.py +++ b/pygost/gost3410.py @@ -242,7 +242,7 @@ for _name, _curve in CURVES.items(): DEFAULT_CURVE = CURVES["id-tc26-gost-3410-12-256-paramSetB"] -def public_key(curve, prv): +def public_key(curve, prv, mask=None): """Generate public key from the private one :param GOST3410Curve curve: curve to use @@ -250,10 +250,13 @@ def public_key(curve, prv): :returns: public key's parts, X and Y :rtype: (long, long) """ - return curve.exp(prv) + pub = curve.exp(prv) + if mask is not None: + pub = curve.exp(mask, pub[0], pub[1]) + return pub -def sign(curve, prv, digest, rand=None): +def sign(curve, prv, digest, rand=None, mask=None): """Calculate signature for provided digest :param GOST3410Curve curve: curve to use @@ -278,13 +281,18 @@ def sign(curve, prv, digest, rand=None): k = bytes2long(rand) % q if k == 0: continue - r, _ = curve.exp(k) + r, y = curve.exp(k) + if mask is not None: + r, y = curve.exp(mask, x=r, y=y) r %= q if r == 0: continue d = prv * r k *= e - s = (d + k) % q + s = d + k + if mask is not None: + s *= mask + s %= q if s == 0: continue break