]> Cypherpunks.ru repositories - pygost.git/commitdiff
UKM is actually just a number
authorSergey Matveev <stargrave@stargrave.org>
Sat, 19 Nov 2016 19:29:21 +0000 (22:29 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sat, 19 Nov 2016 19:29:21 +0000 (22:29 +0300)
pygost/gost3410_vko.py
pygost/stubs/pygost/gost3410_vko.pyi
pygost/test_gost3410_vko.py

index 35cc06f103293625449dfddbdea59814c37685fe..719c4f40f4d17b5ee9ec311354430ba59d0c31b6 100644 (file)
@@ -24,6 +24,15 @@ from pygost.gost341194 import GOST341194
 from pygost.utils import bytes2long
 
 
+def ukm_unmarshal(ukm):
+    """Unmarshal UKM value
+
+    :type ukm: bytes
+    :rtype: long
+    """
+    return bytes2long(ukm[::-1])
+
+
 def vko_34102001(curve, prv, pubkey, ukm):
     """ Make Diffie-Hellman computation (34.10-2001, 34.11-94)
 
@@ -31,8 +40,7 @@ def vko_34102001(curve, prv, pubkey, ukm):
     :param long prv: private key
     :param pubkey: public key
     :type pubkey: (long, long)
-    :param ukm: UKM value (VKO-factor)
-    :type ukm: bytes, 8 bytes
+    :param long ukm: user keying material, VKO-factor
     :returns: Key Encryption Key (shared key)
     :rtype: bytes, 32 bytes
 
@@ -41,39 +49,37 @@ def vko_34102001(curve, prv, pubkey, ukm):
     hash output.
     """
     key = curve.exp(prv, pubkey[0], pubkey[1])
-    key = curve.exp(bytes2long(24 * b"\x00" + ukm), key[0], key[1])
+    key = curve.exp(ukm, key[0], key[1])
     return GOST341194(pub_marshal(key), "GostR3411_94_CryptoProParamSet").digest()
 
 
-def vko_34102012256(curve, prv, pubkey, ukm=b"\x00\x00\x00\x00\x00\x00\x00\01"):
+def vko_34102012256(curve, prv, pubkey, ukm=1):
     """ Make Diffie-Hellman computation (34.10-2012, 34.11-2012 256 bit)
 
     :param GOST3410Curve curve: curve to use
     :param long prv: private key
     :param pubkey: public key
     :type pubkey: (long, long)
-    :param ukm: UKM value (VKO-factor)
-    :type ukm: bytes, 8 bytes
+    :param long ukm: user keying material, VKO-factor
     :returns: Key Encryption Key (shared key)
     :rtype: bytes, 32 bytes
     """
     key = curve.exp(prv, pubkey[0], pubkey[1])
-    key = curve.exp(bytes2long(ukm[::-1]), key[0], key[1])
+    key = curve.exp(ukm, key[0], key[1])
     return GOST34112012256(pub_marshal(key, mode=2012)).digest()
 
 
-def vko_34102012512(curve, prv, pubkey, ukm=b"\x00\x00\x00\x00\x00\x00\x00\01"):
+def vko_34102012512(curve, prv, pubkey, ukm=1):
     """ Make Diffie-Hellman computation (34.10-2012, 34.11-2012 512 bit)
 
     :param GOST3410Curve curve: curve to use
     :param long prv: private key
     :param pubkey: public key
     :type pubkey: (long, long)
-    :param ukm: UKM value (VKO-factor)
-    :type ukm: bytes, 8 bytes
+    :param long ukm: user keying material, VKO-factor
     :returns: Key Encryption Key (shared key)
     :rtype: bytes, 32 bytes
     """
     key = curve.exp(prv, pubkey[0], pubkey[1])
-    key = curve.exp(bytes2long(ukm[::-1]), key[0], key[1])
+    key = curve.exp(ukm, key[0], key[1])
     return GOST34112012512(pub_marshal(key, mode=2012)).digest()
index b177ac6edde5a2f532cca8a95b32628f803213da..e497261da1c3039f619881a1844396dfcd030a8e 100644 (file)
@@ -2,10 +2,13 @@ from pygost.gost3410 import GOST3410Curve
 from pygost.gost3410 import PublicKey
 
 
-def vko_34102001(curve: GOST3410Curve, prv: int, pubkey: PublicKey, ukm: bytes) -> bytes: ...
+def ukm_unmarshal(ukm: bytes) -> int: ...
 
 
-def vko_34102012256(curve: GOST3410Curve, prv: int, pubkey: PublicKey, ukm: bytes=...) -> bytes: ...
+def vko_34102001(curve: GOST3410Curve, prv: int, pubkey: PublicKey, ukm: int) -> bytes: ...
 
 
-def vko_34102012512(curve: GOST3410Curve, prv: int, pubkey: PublicKey, ukm: bytes=...) -> bytes: ...
+def vko_34102012256(curve: GOST3410Curve, prv: int, pubkey: PublicKey, ukm: int=...) -> bytes: ...
+
+
+def vko_34102012512(curve: GOST3410Curve, prv: int, pubkey: PublicKey, ukm: int=...) -> bytes: ...
index 1ec5c02bba3f540ff915b18f576a32f81bd733e3..472d550b4eab3c23b664f52029a898c0bd071247 100644 (file)
@@ -23,6 +23,7 @@ from pygost.gost3410 import GOST3410Curve
 from pygost.gost3410 import prv_unmarshal
 from pygost.gost3410 import pub_unmarshal
 from pygost.gost3410 import public_key
+from pygost.gost3410_vko import ukm_unmarshal
 from pygost.gost3410_vko import vko_34102001
 from pygost.gost3410_vko import vko_34102012256
 from pygost.gost3410_vko import vko_34102012512
@@ -34,7 +35,7 @@ class TestVKO34102001(TestCase):
     def test_sequence(self):
         curve = GOST3410Curve(*CURVE_PARAMS["GostR3410_2001_TestParamSet"])
         for _ in range(10):
-            ukm = urandom(8)
+            ukm = ukm_unmarshal(urandom(8))
             prv1 = bytes2long(urandom(32))
             prv2 = bytes2long(urandom(32))
             pub1 = public_key(curve, prv1)
@@ -52,7 +53,7 @@ class TestVKO34102012256(TestCase):
     """
     def test_vector(self):
         curve = GOST3410Curve(*CURVE_PARAMS["GostR3410_2012_TC26_ParamSetA"])
-        ukm = hexdec("1d80603c8544c727")
+        ukm = ukm_unmarshal(hexdec("1d80603c8544c727"))
         prvA = prv_unmarshal(hexdec("c990ecd972fce84ec4db022778f50fcac726f46708384b8d458304962d7147f8c2db41cef22c90b102f2968404f9b9be6d47c79692d81826b32b8daca43cb667"))
         pubA = pub_unmarshal(hexdec("aab0eda4abff21208d18799fb9a8556654ba783070eba10cb9abb253ec56dcf5d3ccba6192e464e6e5bcb6dea137792f2431f6c897eb1b3c0cc14327b1adc0a7914613a3074e363aedb204d38d3563971bd8758e878c9db11403721b48002d38461f92472d40ea92f9958c0ffa4c93756401b97f89fdbe0b5e46e4a4631cdb5a"), mode=2012)
         prvB = prv_unmarshal(hexdec("48c859f7b6f11585887cc05ec6ef1390cfea739b1a18c0d4662293ef63b79e3b8014070b44918590b4b996acfea4edfbbbcccc8c06edd8bf5bda92a51392d0db"))
@@ -64,7 +65,7 @@ class TestVKO34102012256(TestCase):
     def test_sequence(self):
         curve = GOST3410Curve(*CURVE_PARAMS["GostR3410_2012_TC26_ParamSetA"])
         for _ in range(10):
-            ukm = urandom(8)
+            ukm = ukm_unmarshal(urandom(8))
             prv1 = bytes2long(urandom(32))
             prv2 = bytes2long(urandom(32))
             pub1 = public_key(curve, prv1)
@@ -82,7 +83,7 @@ class TestVKO34102012512(TestCase):
     """
     def test_vector(self):
         curve = GOST3410Curve(*CURVE_PARAMS["GostR3410_2012_TC26_ParamSetA"])
-        ukm = hexdec("1d80603c8544c727")
+        ukm = ukm_unmarshal(hexdec("1d80603c8544c727"))
         prvA = prv_unmarshal(hexdec("c990ecd972fce84ec4db022778f50fcac726f46708384b8d458304962d7147f8c2db41cef22c90b102f2968404f9b9be6d47c79692d81826b32b8daca43cb667"))
         pubA = pub_unmarshal(hexdec("aab0eda4abff21208d18799fb9a8556654ba783070eba10cb9abb253ec56dcf5d3ccba6192e464e6e5bcb6dea137792f2431f6c897eb1b3c0cc14327b1adc0a7914613a3074e363aedb204d38d3563971bd8758e878c9db11403721b48002d38461f92472d40ea92f9958c0ffa4c93756401b97f89fdbe0b5e46e4a4631cdb5a"), mode=2012)
         prvB = prv_unmarshal(hexdec("48c859f7b6f11585887cc05ec6ef1390cfea739b1a18c0d4662293ef63b79e3b8014070b44918590b4b996acfea4edfbbbcccc8c06edd8bf5bda92a51392d0db"))
@@ -94,7 +95,7 @@ class TestVKO34102012512(TestCase):
     def test_sequence(self):
         curve = GOST3410Curve(*CURVE_PARAMS["GostR3410_2012_TC26_ParamSetA"])
         for _ in range(10):
-            ukm = urandom(8)
+            ukm = ukm_unmarshal(urandom(8))
             prv1 = bytes2long(urandom(32))
             prv2 = bytes2long(urandom(32))
             pub1 = public_key(curve, prv1)