| |
| # |
| # Python 3.7 Code to implement basic MPIN protocol API |
| # M.Scott August 2018 |
| # |
| |
| import hashlib |
| from XXX import ecp |
| from XXX import ecp2 |
| from XXX import curve |
| from XXX import big |
| from XXX.ecp import * |
| from XXX.ecp2 import * |
| from XXX import pair |
| from XXX.fp12 import * |
| |
| # hash message m to curve point |
| |
| def BLS_H(m): |
| h = hashlib.shake_256() |
| h.update(bytes(m, 'utf-8')) |
| hm=big.from_bytes(h.digest(curve.EFS)) |
| HM=ECp() |
| while not HM.set(hm): |
| hm = hm + 1 |
| return HM |
| |
| # generate key pair, private key SK, public key PK |
| |
| def KeyPairGenerate(): |
| G=ecp2.generator() |
| s = big.rand(curve.r) |
| W=s*G |
| SK = big.to_bytes(s) |
| PK = W.toBytes() |
| return (SK,PK) |
| |
| # Sign message m using private key SK to return signature |
| |
| def sign(m,SK): |
| HM=BLS_H(m) |
| s=big.from_bytes(SK) |
| D=s*HM |
| return D.toBytes(True) |
| |
| # Verify signature given message m, the signature SIG, and the public key W |
| |
| def verify(SIG,m,W): |
| HM=BLS_H(m) |
| G=ecp2.generator() |
| D=ECp() |
| D.fromBytes(SIG) |
| PK=ECp2() |
| PK.fromBytes(W) |
| D=-D |
| |
| # Use new multi-pairing mechanism |
| r=pair.initmp() |
| pair.another(r,G,D) |
| pair.another(r,PK,HM) |
| v=pair.miller(r) |
| |
| #.. or alternatively |
| # v = pair.double_ate(G, D, PK, HM) |
| |
| v = pair.fexp(v) |
| if v.isone(): |
| return True |
| return False |