Go 1.11.5 and Go 1.10.8 are released
groups.google.com
groups.google.com
> These inputs might be delivered via TLS handshakes, X.509 certificates, JWT tokens, ECDH shares or ECDSA signatures. In some cases, if an ECDH private key is reused more than once, the attack can also lead to key recovery.
> The issue is CVE-2019-6486 and Go issue golang.org/issue/29903. See the Go issue for more details.
beta8 := new(big.Int).Lsh(beta, 3)
beta8.Mod(beta8, curve.P)
https://golang.org/pkg/math/big/#Int.Mod x3 = alpha * alpha
beta8 = beta << 3
// beta8 %= curve.P
x3 -= beta8
while x3 < 0 {
x3 += curve.P
}
Essentially we want to compute `(alpha * alpha - beta * 8) % curve.P`, so to say. The modulo is expensive though, so for typical cases we can just repeatedly add `curve.P` to compute the modulo a few times. This is indeed a valid optimization when we are sure of the range of `alpha` and `beta`, but `beta` can be controlled outside. So a very large `beta` from an attacker will cause the while loop run forever---a denial-of-service attack. beta8.Mod(beta8, curve.P)
x3.Sub(x3, beta8)
if x3.Sign() == -1 {
x3.Add(x3, curve.P)
}
x3.Mod(x3, curve.P)
I don't understand it why it's all necessary. This is shorter and seems to do the exact same thing: beta8.Mod(beta8, curve.P)
x3.Sub(x3, beta8)
x3.Mod(x3, curve.P)
Also, beta8 is never used after this code. So this should do the same thing as well: x3.Sub(x3, beta8)
x3.Mod(x3, curve.P)I'm not a "gopher".
Does this label bother anyone else? I love the go programming language but I'm definitely not on board with this.
I happen to be a software developer who found effectiveness and value in Go and will continue to use it as long as it proves effective. That is all.
They are called "Real Programmers", a nickname shared with the Assembly, C, Lisp, Prolog, and Ada programmers.