packages feed

crypto-srp-0.1.0.0: test/pysrp_server.py

#!/usr/bin/env python3
"""
pysrp compatibility server for crypto-srp tests.

Protocol (all values hex-encoded, one value per line):
  stdin:  A
  stdout: salt B
  stdin:  M1
  stdout: M2   (or FAIL if M1 did not verify)

Username and password are read from environment variables PYSRP_USER and PYSRP_PASS.
"""
import os
import sys
import srp

# Use RFC 5054 padding (PAD(g) for k, PAD(A)/PAD(B) for u) to match crypto-srp.
srp.rfc5054_enable()

user = os.environ["PYSRP_USER"]
password = os.environ["PYSRP_PASS"]

salt, verifier = srp.create_salted_verification_key(
    user, password, hash_alg=srp.SHA256, ng_type=srp.NG_2048
)

a_hex = sys.stdin.readline().strip()
A = bytes.fromhex(a_hex)

svr = srp.Verifier(user, salt, verifier, A, hash_alg=srp.SHA256, ng_type=srp.NG_2048)
svr_salt, B = svr.get_challenge()

sys.stdout.write(svr_salt.hex() + " " + B.hex() + "\n")
sys.stdout.flush()

m1_hex = sys.stdin.readline().strip()
M1 = bytes.fromhex(m1_hex)

HAMK = svr.verify_session(M1)
if HAMK is None:
    sys.stdout.write("FAIL\n")
else:
    sys.stdout.write(HAMK.hex() + "\n")
sys.stdout.flush()