proofs/crypto/secp256k1/laws_schnorr.bend

bend-collections-laws-crypto@1.0.0.0 · 41 lines · 3 definitions

1import Base
2import bend-collections-laws-crypto@1.0.0.0/src/crypto/secp256k1.bend as K
3import bend-collections-laws-crypto@1.0.0.0/spec/crypto/secp256k1/ecdsa.bend as ES
4import bend-collections-laws-crypto@1.0.0.0/spec/crypto/secp256k1/schnorr.bend as SS
5
6# The clauses of src/crypto/secp256k1.bend: every function is its
7# specification (spec/crypto/secp256k1/, over the natural numbers, from
8# SEC 1 v2, SEC 2, RFC 6979, BIP-340 and the Ethereum yellow paper) for
9# every input (any byte lists, any Bool). The specification takes `one`,
10# the number 1 kept symbolic (h1: one == 1), so that its 256-bit constants
11# p, n and G are never expanded by the checker; every clause holds for the
12# one `one` there is.
13#
14# The clauses are in five files, each proved by its own root (so that
15# each root checks alone): laws.bend (keys and addresses, proof.bend),
16# laws_sign.bend (proof_sign.bend), laws_verify.bend (proof_verify.bend),
17# laws_recover.bend (proof_recover.bend) and laws_schnorr.bend
18# (proof_schnorr.bend). This file: proof_schnorr.bend.
19
20# BIP-340 x-only public keys, signing and verification
21law SchnorrPubkey.correct:
22  for +one: Nat
23  for +h1: {one == 1n : Nat}
24  for +sk: List<&2, U32>
25  {K.schnorr_pubkey(sk) == SS.pubkey(one, sk) : Maybe<&2, List<&2, U32>>}
26
27law SchnorrSign.correct:
28  for +one: Nat
29  for +h1: {one == 1n : Nat}
30  for +sk: List<&2, U32>
31  for +msg: List<&2, U32>
32  for +aux: List<&2, U32>
33  {K.schnorr_sign(sk, msg, aux) == SS.sign(one, sk, msg, aux) : Maybe<&2, List<&2, U32>>}
34
35law SchnorrVerify.correct:
36  for +one: Nat
37  for +h1: {one == 1n : Nat}
38  for +pk: List<&2, U32>
39  for +msg: List<&2, U32>
40  for +sig: List<&2, U32>
41  {K.schnorr_verify(pk, msg, sig) == SS.verify(one, pk, msg, sig) : Bool}