From: Sergey Matveev Date: Sat, 19 Nov 2016 19:29:21 +0000 (+0300) Subject: UKM is actually just a number X-Git-Tag: 3.0~8 X-Git-Url: http://www.git.cypherpunks.ru/?a=commitdiff_plain;h=d9b48dd1937f5acd55c0eb6d92e1b5b98e6d302e;p=pygost.git UKM is actually just a number --- diff --git a/pygost/gost3410_vko.py b/pygost/gost3410_vko.py index 35cc06f..719c4f4 100644 --- a/pygost/gost3410_vko.py +++ b/pygost/gost3410_vko.py @@ -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() diff --git a/pygost/stubs/pygost/gost3410_vko.pyi b/pygost/stubs/pygost/gost3410_vko.pyi index b177ac6..e497261 100644 --- a/pygost/stubs/pygost/gost3410_vko.pyi +++ b/pygost/stubs/pygost/gost3410_vko.pyi @@ -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: ... diff --git a/pygost/test_gost3410_vko.py b/pygost/test_gost3410_vko.py index 1ec5c02..472d550 100644 --- a/pygost/test_gost3410_vko.py +++ b/pygost/test_gost3410_vko.py @@ -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)