]> Cypherpunks.ru repositories - pygost.git/blobdiff - pygost/gost3410.py
Support or masked 34.10 keys
[pygost.git] / pygost / gost3410.py
index cdb5b039eb1dd876604c74d4c63135721c1a3fd5..c12b17003a296d2299bd217fa8c4335e5793e634 100644 (file)
@@ -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