]> Cypherpunks repositories - gostls13.git/commitdiff
crypto/internal/edwards25519: reduce Point size by reordering fields
authorJorropo <jorropo.pgm@gmail.com>
Mon, 13 Feb 2023 00:48:57 +0000 (01:48 +0100)
committerFilippo Valsorda <filippo@golang.org>
Mon, 13 Feb 2023 19:21:54 +0000 (19:21 +0000)
Updates #58483

Tested on Linux amd64:
  type Element struct {
    l0, l1, l2, l3, l4 uint64
  }

  type PointAfter struct {
    x, y, z, t Element
    _          incomparable
  }

  type PointBefore struct {
    _          incomparable
    x, y, z, t Element
  }

  type incomparable [0]func()

  func main() {
    fmt.Println(unsafe.Sizeof(PointAfter{})) // 168
    fmt.Println(unsafe.Sizeof(PointBefore{})) // 160
  }

Change-Id: I6c4fcb586bbf3febf62b6e54608496ff81685e43
Reviewed-on: https://go-review.googlesource.com/c/go/+/467616
Reviewed-by: Roland Shoemaker <roland@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Filippo Valsorda <filippo@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
Run-TryBot: Filippo Valsorda <filippo@golang.org>

src/crypto/internal/edwards25519/edwards25519.go

index 71e9c097a954413a0f4d5687c5fb8b093498aea1..e162dc8cbde3265324a95e31dda3904ef142e79c 100644 (file)
@@ -26,13 +26,13 @@ type projP2 struct {
 //
 // The zero value is NOT valid, and it may be used only as a receiver.
 type Point struct {
-       // The point is internally represented in extended coordinates (X, Y, Z, T)
-       // where x = X/Z, y = Y/Z, and xy = T/Z per https://eprint.iacr.org/2008/522.
-       x, y, z, t field.Element
-
        // Make the type not comparable (i.e. used with == or as a map key), as
        // equivalent points can be represented by different Go values.
        _ incomparable
+
+       // The point is internally represented in extended coordinates (X, Y, Z, T)
+       // where x = X/Z, y = Y/Z, and xy = T/Z per https://eprint.iacr.org/2008/522.
+       x, y, z, t field.Element
 }
 
 type incomparable [0]func()