proofs/crypto/ed25519/scalar2.bend checks
raw source on the hub · import bend-collections-laws-crypto@1.0.0.0/proofs/crypto/ed25519/scalar2.bend as Scalar2
23 imports
import Base import ../../../spec/lib/common.bend as C import ../../../spec/crypto/curve25519/field.bend as FS import ../../../spec/crypto/curve25519/x25519.bend as SX import ../../../src/crypto/curve25519/field.bend as F import ../../../src/crypto/curve25519/x25519.bend as X import ../../../src/crypto/ed25519/scalar.bend as ESC import ../../lib/nat.bend as N import ../../lib/logic.bend as L import ../../lib/word.bend as WD import ../../lib/arith.bend as AR import ../../lib/u32.bend as U import ../../lib/u32alg.bend as A import ../../lib/lemmas/proofs/nat_algebra.bend as NA import ../../math/natural/arith.bend as NR import ../../math/typed/width.bend as WI import ../curve25519/num.bend as M import ../curve25519/limbs.bend as LM import ../curve25519/consts.bend as K import ../curve25519/fieldops.bend as FO import ../curve25519/cong.bend as G import ../curve25519/xbits.bend as XB import ./scalar.bend as SC
Definitions
def v source · line 30 · raw
@+x:U32 -> Nat
def shift_sc source · line 33 · raw
@+k:Nat -> @+x:Nat -> {0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.shift(k, x) == 0xa7e654f9780078ca65bf9e187da99d3e/proofs/lib/word.sc(k, x) : Nat}
def low_step source · line 41 · raw
@+t:Nat -> @+V:Nat -> {0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.low(1n+t, V) == Nat.add(0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.low(t, V), 0xa7e654f9780078ca65bf9e187da99d3e/proofs/lib/word.sc(t, 0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.bit(0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.high(t, V)))) : Nat}bit t joins the low t bits
def byte_fits source · line 56 · raw
@+bs:List<&2, U32> -> @+hb:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.lea(bs, 255n) == True{} : Bool} -> {0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.high(0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/curve25519/x25519.bitlen(bs), 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(bs)) == 0n : Nat}a byte string's value fits its bit count
def low_all source · line 67 · raw
@+bs:List<&2, U32> -> @+hb:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.lea(bs, 255n) == True{} : Bool} -> {0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.low(0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/curve25519/x25519.bitlen(bs), 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(bs)) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(bs) : Nat}
def macg source · line 72 · raw
@n:Nat -> @+bs:List<&2, U32> -> @+s:List<&2, U32> -> @+acc:List<&2, U32> -> @+cp:List<&2, U32> -> List<&2, U32>
def mac_eq source · line 80 · raw
@+n:Nat -> @+bs:List<&2, U32> -> @+s:List<&2, U32> -> @+acc:List<&2, U32> -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/ed25519/scalar.mac(n, bs, s, acc) == macg(n, bs, s, acc, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/ed25519/scalar.comp_l) : List<&2, U32>}
def sel_okb source · line 88 · raw
@+one:Nat -> @+h1:{one == 1n : Nat} -> @+kb:U32 -> @+b:Nat -> @+hk:{v(kb) == b : Nat} -> @+hb:{Nat.is_le(b, 1n) == True{} : Bool} -> @+s:List<&2, U32> -> @+hs:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, s, 255n) == True{} : Bool} -> {0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/curve25519/field.select(kb, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/curve25519/field.zero, s), 255n) == True{} : Bool}the selected addend: bit * s
def sel_val source · line 101 · raw
@+one:Nat -> @+h1:{one == 1n : Nat} -> @+kb:U32 -> @+b:Nat -> @+hk:{v(kb) == b : Nat} -> @+hb:{Nat.is_le(b, 1n) == True{} : Bool} -> @+s:List<&2, U32> -> @+hs:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, s, 255n) == True{} : Bool} -> {0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/curve25519/field.select(kb, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/curve25519/field.zero, s)) == Nat.mul(b, 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(s)) : Nat}
def sel_lt source · line 114 · raw
@+mm:Nat -> @+b:Nat -> @+S:Nat -> @+hb:{Nat.is_le(b, 1n) == True{} : Bool} -> @+ls:{Nat.is_lt(S, 1n+mm) == True{} : Bool} -> {Nat.is_lt(Nat.mul(b, S), 1n+mm) == True{} : Bool}
def mac_okb source · line 123 · raw
@+one:Nat -> @+h1:{one == 1n : Nat} -> @+mm:Nat -> @+cp:List<&2, U32> -> @+hk:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, cp, 255n) == True{} : Bool} -> @+hv:{Nat.add(0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/consts.valo(one, cp), 1n+mm) == 0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/ed25519/scalar.T(one) : Nat} -> @+n:Nat -> @+bs:List<&2, U32> -> @+s:List<&2, U32> -> @+acc:List<&2, U32> -> @+hbs:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.lea(bs, 255n) == True{} : Bool} -> @+hs:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, s, 255n) == True{} : Bool} -> @+ha:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, acc, 255n) == True{} : Bool} -> {0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, macg(n, bs, s, acc, cp), 255n) == True{} : Bool}
def mac_lt source · line 134 · raw
@+one:Nat -> @+h1:{one == 1n : Nat} -> @+mm:Nat -> @+h2:{Nat.is_le(Nat.add(1n+mm, 1n+mm), 0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/ed25519/scalar.T(one)) == True{} : Bool} -> @+cp:List<&2, U32> -> @+hk:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, cp, 255n) == True{} : Bool} -> @+hv:{Nat.add(0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/consts.valo(one, cp), 1n+mm) == 0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/ed25519/scalar.T(one) : Nat} -> @+n:Nat -> @+bs:List<&2, U32> -> @+s:List<&2, U32> -> @+acc:List<&2, U32> -> @+hbs:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.lea(bs, 255n) == True{} : Bool} -> @+hs:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, s, 255n) == True{} : Bool} -> @+ls:{Nat.is_lt(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(s), 1n+mm) == True{} : Bool} -> @+ha:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, acc, 255n) == True{} : Bool} -> @+la:{Nat.is_lt(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(acc), 1n+mm) == True{} : Bool} -> 0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/cong.ceq(mm, 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(macg(n, bs, s, acc, cp)), Nat.add(0xa7e654f9780078ca65bf9e187da99d3e/proofs/lib/word.sc(n, 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(acc)), Nat.mul(0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.low(n, 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(bs)), 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(s))))
def mac_below source · line 172 · raw
@+one:Nat -> @+h1:{one == 1n : Nat} -> @+mm:Nat -> @+h2:{Nat.is_le(Nat.add(1n+mm, 1n+mm), 0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/ed25519/scalar.T(one)) == True{} : Bool} -> @+cp:List<&2, U32> -> @+hk:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, cp, 255n) == True{} : Bool} -> @+hv:{Nat.add(0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/consts.valo(one, cp), 1n+mm) == 0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/ed25519/scalar.T(one) : Nat} -> @+n:Nat -> @+bs:List<&2, U32> -> @+s:List<&2, U32> -> @+acc:List<&2, U32> -> @+hbs:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.lea(bs, 255n) == True{} : Bool} -> @+hs:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, s, 255n) == True{} : Bool} -> @+ls:{Nat.is_lt(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(s), 1n+mm) == True{} : Bool} -> @+ha:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, acc, 255n) == True{} : Bool} -> @+la:{Nat.is_lt(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(acc), 1n+mm) == True{} : Bool} -> {Nat.is_lt(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(macg(n, bs, s, acc, cp)), 1n+mm) == True{} : Bool}
def mac_val source · line 194 · raw
@+one:Nat -> @+h1:{one == 1n : Nat} -> @+mm:Nat -> @+h2:{Nat.is_le(Nat.add(1n+mm, 1n+mm), 0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/ed25519/scalar.T(one)) == True{} : Bool} -> @+cp:List<&2, U32> -> @+hk:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, cp, 255n) == True{} : Bool} -> @+hv:{Nat.add(0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/consts.valo(one, cp), 1n+mm) == 0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/ed25519/scalar.T(one) : Nat} -> @+n:Nat -> @+bs:List<&2, U32> -> @+s:List<&2, U32> -> @+acc:List<&2, U32> -> @+hbs:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.lea(bs, 255n) == True{} : Bool} -> @+hs:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, s, 255n) == True{} : Bool} -> @+ls:{Nat.is_lt(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(s), 1n+mm) == True{} : Bool} -> @+ha:{0xa7e654f9780078ca65bf9e187da99d3e/proofs/crypto/curve25519/limbs.okb(32n, acc, 255n) == True{} : Bool} -> @+la:{Nat.is_lt(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(acc), 1n+mm) == True{} : Bool} -> {0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(macg(n, bs, s, acc, cp)) == Nat.mod(Nat.add(0xa7e654f9780078ca65bf9e187da99d3e/proofs/lib/word.sc(n, 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(acc)), Nat.mul(0xa7e654f9780078ca65bf9e187da99d3e/spec/lib/common.low(n, 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(bs)), 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/curve25519/field.value(s))), 1n+mm) : Nat}the exact value: the loop result is reduced