]> Cypherpunks.ru repositories - pygost.git/commitdiff
Support or masked 34.10 keys 5.13
authorSergey Matveev <stargrave@stargrave.org>
Mon, 27 Nov 2023 12:12:54 +0000 (15:12 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Mon, 27 Nov 2023 12:14:21 +0000 (15:14 +0300)
news.texi
pygost/__init__.py
pygost/gost3410.py
pygost/gost3410_vko.py

index 1dabeea1f461c607d1b44f6049eb86f1287159a8..ec14a0b01be5d847fcde27a9d37475050283be37 100644 (file)
--- a/news.texi
+++ b/news.texi
@@ -3,6 +3,10 @@
 
 @table @strong
 
+@anchor{Release 5.13}
+@item 5.13
+Ability to use masked 34.10 private keys.
+
 @anchor{Release 5.12}
 @item 5.12
 Fixed incorrect digest calculation when using @code{GOST34112012*.update()}
index c0695ad7d1b42bec17e338d31a0fe047bf643eee..fba79324c6a88abffcdb50ef910d4393dc095ace 100644 (file)
@@ -3,4 +3,4 @@
 PyGOST is free software: see the file COPYING for copying conditions.
 """
 
-__version__ = "5.12"
+__version__ = "5.13"
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
index 92f4a2610d7093eb77340aaf7bc5493ad3d23983..3f169dc106df8fba40d46cc5fb198e9dc4e23152 100644 (file)
@@ -32,11 +32,13 @@ def ukm_unmarshal(ukm):
     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)