diff --git a/ecc/bw6-761/fr/mimc/mimc.go b/ecc/bw6-761/fr/mimc/mimc.go index d575a63d9..4fc1df03a 100644 --- a/ecc/bw6-761/fr/mimc/mimc.go +++ b/ecc/bw6-761/fr/mimc/mimc.go @@ -142,13 +142,9 @@ func (d *digest) checksum() fr.Element { func (d *digest) encrypt(m fr.Element) fr.Element { once.Do(initConstants) // init constants - var tmp fr.Element for i := 0; i < mimcNbRounds; i++ { - // m = (m+k+c)^5 - tmp.Add(&m, &d.h).Add(&tmp, &mimcConstants[i]) - m.Square(&tmp). - Square(&m). - Mul(&m, &tmp) + // m = 1/(m+k+c) + m.Add(&m, &d.h).Add(&m, &mimcConstants[i]).Inverse(&m) } m.Add(&m, &d.h) return m diff --git a/internal/generator/crypto/hash/mimc/template/mimc.go.tmpl b/internal/generator/crypto/hash/mimc/template/mimc.go.tmpl index f396c8644..d58937271 100644 --- a/internal/generator/crypto/hash/mimc/template/mimc.go.tmpl +++ b/internal/generator/crypto/hash/mimc/template/mimc.go.tmpl @@ -177,6 +177,20 @@ func (d *digest) encrypt(m fr.Element) fr.Element { m.Add(&m, &d.h) return m } +{{ else if eq .Name "bw6-761" }} +// plain execution of a mimc run +// m: message +// k: encryption key +func (d *digest) encrypt(m fr.Element) fr.Element { + once.Do(initConstants) // init constants + + for i := 0; i < mimcNbRounds; i++ { + // m = 1/(m+k+c) + m.Add(&m, &d.h).Add(&m, &mimcConstants[i]).Inverse(&m) + } + m.Add(&m, &d.h) + return m +} {{ else }} // plain execution of a mimc run // m: message