Host-customized fork of https://github.com/tecnovert/basicswap/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
36 lines
1.0 KiB
36 lines
1.0 KiB
# -*- coding: utf-8 -*- |
|
|
|
import secrets |
|
import hashlib |
|
import basicswap.contrib.ed25519_fast as edf |
|
|
|
|
|
def get_secret(): |
|
return 9 + secrets.randbelow(edf.l - 9) |
|
|
|
|
|
def encodepoint(P): |
|
zi = edf.inv(P[2]) |
|
x = (P[0] * zi) % edf.q |
|
y = (P[1] * zi) % edf.q |
|
y += ((x & 1) << 255) |
|
return y.to_bytes(32, byteorder='little') |
|
|
|
|
|
def hashToEd25519(bytes_in): |
|
hashed = hashlib.sha256(bytes_in).digest() |
|
for i in range(1000): |
|
h255 = bytearray(hashed) |
|
x_sign = 0 if h255[31] & 0x80 == 0 else 1 |
|
h255[31] &= 0x7f # Clear top bit |
|
y = int.from_bytes(h255, byteorder='little') |
|
x = edf.xrecover(y, x_sign) |
|
if x == 0 and y == 1: # Skip infinity point |
|
continue |
|
|
|
P = [x, y, 1, (x * y) % edf.q] |
|
# Keep trying until the point is in the correct subgroup |
|
if edf.isoncurve(P) and edf.is_identity(edf.scalarmult(P, edf.l)): |
|
return P |
|
hashed = hashlib.sha256(hashed).digest() |
|
raise ValueError('hashToEd25519 failed')
|
|
|