>>> from os import urandom
>>> prv_raw = urandom(64)
>>> from pygost.gost3410 import prv_unmarshal
+ >>> from pygost.gost3410 import prv_marshal
>>> prv = prv_unmarshal(prv_raw)
+ >>> prv_raw = prv_marshal(curve, prv)
>>> from pygost.gost3410 import public_key
>>> pub = public_key(curve, prv)
>>> from pygost.gost3410 import pub_marshal
@table @strong
+@anchor{Release 5.4}
+@item 5.4
+@item @code{gost3410.prv_marshal} helper can make private keys that are
+in curve's Q field, for better compatibility with some implementations.
+
@anchor{Release 5.3}
@item 5.3
@itemize
PyGOST is free software: see the file COPYING for copying conditions.
"""
-__version__ = "5.3"
+__version__ = "5.4"
:param bytes prv: serialized private key
:rtype: long
+
+ It is advisable to use :py:func:`pygost.gost3410.prv_marshal` to
+ assure that key i in curve's Q field for better compatibility with
+ some implementations.
"""
return bytes2long(prv[::-1])
+def prv_marshal(curve, prv):
+ """Marshal little-endian private key
+
+ :param GOST3410Curve curve: curve to use
+ :param long prv: serialized private key
+ :rtype: bytes
+
+ Key is in curve's Q field.
+ """
+ return long2bytes(prv % curve.q, point_size(prv))[::-1]
+
+
def pub_marshal(pub):
"""Marshal public key
def prv_unmarshal(prv: bytes) -> int: ...
+def prv_marshal(curve: GOST3410Curve, prv: int) -> bytes: ...
+
+
def pub_marshal(pub: PublicKey) -> bytes: ...
from pygost.gost3410 import CURVES
from pygost.gost3410 import GOST3410Curve
+from pygost.gost3410 import prv_marshal
+from pygost.gost3410 import prv_unmarshal
from pygost.gost3410 import public_key
from pygost.gost3410 import sign
from pygost.gost3410 import uv2xy
def test_sequence(self):
c = CURVES["id-GostR3410-2001-TestParamSet"]
- prv = bytes2long(urandom(32))
- pubX, pubY = public_key(c, prv)
+ prv = prv_unmarshal(urandom(32))
+ pubX, pubY = public_key(c, prv_unmarshal(prv_marshal(c, prv)))
for _ in range(20):
digest = urandom(32)
s = sign(c, prv, digest)
def test_sequence(self):
c = CURVES["id-tc26-gost-3410-12-512-paramSetA"]
prv = bytes2long(urandom(64))
- pubX, pubY = public_key(c, prv)
+ pubX, pubY = public_key(c, prv_unmarshal(prv_marshal(c, prv)))
for _ in range(20):
digest = urandom(64)
s = sign(c, prv, digest)