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)
: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
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()
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: ...
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
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)
"""
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"))
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)
"""
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"))
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)