@@ -141,6 +141,41 @@ def reverse_map(x, y, i):
141
141
[(fe (0x3498662504b73c7c8cecb6c33cd493bdfc190e0f87d913d7ff9ad42e222bfe95 ), fe (0x245b3a61b8d46997f14f2fea2874899691eb32542b9907d65eb9d21d42454021 )), [fe (0x7f556282c3dd9d263390d6bbddada698ab8fd7c7d1a06498f42b30437c8361ad ), None , None , None ]]
142
142
]
143
143
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
+
144
179
class TestFrameworkEllsq (unittest .TestCase ):
145
180
def test_fe_to_ge_to_fe (self ):
146
181
for i in range (100 ):
0 commit comments