Skip to content

Commit 3307193

Browse files
committed
Add functions for encoding and decoding to bytes
Source: https://github.com/sipa/writeups/tree/main/elligator-square-for-bn
1 parent 692ef04 commit 3307193

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

test/functional/test_framework/ellsq.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,41 @@ def reverse_map(x, y, i):
141141
[(fe(0x3498662504b73c7c8cecb6c33cd493bdfc190e0f87d913d7ff9ad42e222bfe95), fe(0x245b3a61b8d46997f14f2fea2874899691eb32542b9907d65eb9d21d42454021)), [fe(0x7f556282c3dd9d263390d6bbddada698ab8fd7c7d1a06498f42b30437c8361ad), None , None , None ]]
142142
]
143143

144+
def encode(P):
145+
while True:
146+
u = fe(random.randrange(1, SECP256K1_ORDER))
147+
ge = forward_map(u)
148+
# convert ge to jacobian form for EC operations
149+
ge = (ge[0].val, ge[1].val, 1)
150+
T = SECP256K1.negate(ge)
151+
Q = SECP256K1.add(T, SECP256K1.affine(P))
152+
if SECP256K1.is_infinity(Q):
153+
Q = T
154+
j = random.randrange(4)
155+
Q = SECP256K1.affine(Q)
156+
v = reverse_map(fe(Q[0]), fe(Q[1]), j)
157+
if v is not None:
158+
return u, v
159+
160+
def decode(u, v):
161+
ge1 = forward_map(u)
162+
ge2 = forward_map(v)
163+
# convert ge1 and ge2 to jacobian form for EC operations
164+
T = ge1[0].val, ge1[1].val, 1
165+
S = ge2[0].val, ge2[1].val, 1
166+
P = SECP256K1.add(T, S)
167+
if SECP256K1.is_infinity(P):
168+
P = T
169+
P = SECP256K1.affine(P)
170+
return fe(P[0]), fe(P[1])
171+
172+
def encode_bytes(P):
173+
u, v = encode(P)
174+
return u.to_bytes() + v.to_bytes()
175+
176+
def decode_bytes(enc):
177+
return decode(fe.from_bytes(enc[:32]), fe.from_bytes(enc[32:]))
178+
144179
class TestFrameworkEllsq(unittest.TestCase):
145180
def test_fe_to_ge_to_fe(self):
146181
for i in range(100):

0 commit comments

Comments
 (0)