X-Git-Url: http://www.git.cypherpunks.ru/?p=pygost.git;a=blobdiff_plain;f=pygost%2Fgost3410.py;h=1848ef56653d21460f1ccf247d6c22ea8c770e9d;hp=a6b1a7eab87e4ce492dc8392285175b007575291;hb=39eec912f1876d3437889c5ef9187687460ebda8;hpb=c8b2d178e5315f14a31ef82454b3ce36bd4e7f7d diff --git a/pygost/gost3410.py b/pygost/gost3410.py index a6b1a7e..1848ef5 100644 --- a/pygost/gost3410.py +++ b/pygost/gost3410.py @@ -214,13 +214,15 @@ def public_key(curve, prv): return curve.exp(prv) -def sign(curve, prv, digest, mode=2001): +def sign(curve, prv, digest, rand=None, mode=2001): """ Calculate signature for provided digest :param GOST3410Curve curve: curve to use :param long prv: private key :param digest: digest for signing :type digest: bytes, 32 or 64 bytes + :param rand: optional predefined random data used for k/r generation + :type rand: bytes, 32 or 64 bytes :returns: signature :rtype: bytes, 64 or 128 bytes """ @@ -230,7 +232,11 @@ def sign(curve, prv, digest, mode=2001): if e == 0: e = 1 while True: - k = bytes2long(urandom(size)) % q + if rand is None: + rand = urandom(size) + elif len(rand) != size: + raise ValueError("rand length != %d" % size) + k = bytes2long(rand) % q if k == 0: continue r, _ = curve.exp(k)