1 import Base 2 import ../../../src/crypto/secp256k1.bend as K 3 import ../../../src/crypto/secp256k1/ecdsa.bend as E 4 import ../../../spec/crypto/secp256k1/ecdsa.bend as ES 5 import ./laws_sign.bend as Laws 6 import ./psign.bend as PS 7 8 # ECDSA signing of src/crypto/secp256k1.bend (laws.bend Sign.correct): 9 # `bend proofs/crypto/secp256k1/proof_sign.bend`. 10 11 def compact_v(m: Maybe<&2, E.Signature>) -> {K.compact(m) == PS.msig(m) : Maybe<&2, List<&2, U32>>}: 12 match m: 13 case None{}: 14 {==} 15 case Some{sig}: 16 match sig: 17 case E.Signature{r, s, v}: 18 {==} 19 20 def sign_c(+one: Nat, +h1: {one == 1n : Nat}, +sk: List<&2, U32>, +h: List<&2, U32>) -> {K.sign_compact(sk, h) == ES.sign(one, sk, h) : Maybe<&2, List<&2, U32>>}: 21 Equal.trans(Maybe<&2, List<&2, U32>>, K.compact(E.sign(sk, h)), PS.msig(E.sign(sk, h)), ES.sign(one, sk, h), compact_v(E.sign(sk, h)), PS.sign_v(one, h1, sk, h)) 22 23 def Laws.Sign.correct(one, h1, sk, h): 24 sign_c(one, h1, sk, h)