]> Cypherpunks.ru repositories - pygost.git/blobdiff - pygost/gost3410.py
Raise copyright years in advance
[pygost.git] / pygost / gost3410.py
index 6e1bf845f9eb9e396ab82ab771e3a19eb8627a5a..aa161c2c5c9b14a1db3af502ae3b01dc4fb3da75 100644 (file)
@@ -1,6 +1,6 @@
 # coding: utf-8
 # PyGOST -- Pure Python GOST cryptographic functions library
-# Copyright (C) 2015-2023 Sergey Matveev <stargrave@stargrave.org>
+# Copyright (C) 2015-2024 Sergey Matveev <stargrave@stargrave.org>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -55,6 +55,7 @@ class GOST3410Curve(object):
                       the twisted Edwards form
     :param str name: human-readable curve name
     """
+
     def __init__(self, p, q, a, b, x, y, cofactor=1, e=None, d=None, name=None):
         self.p = p
         self.q = q
@@ -241,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
@@ -249,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
@@ -277,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