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
: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
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
return bytes2long(ukm[::-1])
-def kek(curve, prv, pub, ukm):
+def kek(curve, prv, pub, ukm, mask=None):
if not curve.contains(pub):
raise ValueError("pub is not on the curve")
key = curve.exp(prv, pub[0], pub[1])
key = curve.exp(curve.cofactor * ukm, key[0], key[1])
+ if mask is not None:
+ key = curve.exp(mask, key[0], key[1])
return pub_marshal(key)