newhope: use less stack to compute client key

Change-Id: Idf500545317242c8855e67b897975e54969fea10
Reviewed-on: https://boringssl-review.googlesource.com/7782
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/newhope/newhope.c b/crypto/newhope/newhope.c
index 6399bdb..29e189f 100644
--- a/crypto/newhope/newhope.c
+++ b/crypto/newhope/newhope.c
@@ -76,36 +76,40 @@
     return 0;
   }
 
-  /* Generate the same |a| as the server, from the server's seed. */
-  NEWHOPE_POLY a;
-  const uint8_t *seed = &servermsg[POLY_BYTES];
-  newhope_poly_uniform(&a, seed);
-
-  NEWHOPE_POLY pk;
-  newhope_poly_frombytes(&pk, servermsg);
-
   NEWHOPE_POLY sp;
   newhope_poly_getnoise(&sp);
   newhope_poly_ntt(&sp);
 
-  NEWHOPE_POLY ep;
-  newhope_poly_getnoise(&ep);
-  newhope_poly_ntt(&ep);
-
-  NEWHOPE_POLY epp;
-  newhope_poly_getnoise(&epp);
-
   /* The first part of the client's message is the polynomial bp=e'+a*s' */
-  NEWHOPE_POLY bp;
-  newhope_poly_pointwise(&bp, &a, &sp);
-  newhope_poly_add(&bp, &bp, &ep);
-  newhope_poly_tobytes(clientmsg, &bp);
+  {
+    NEWHOPE_POLY ep;
+    newhope_poly_getnoise(&ep);
+    newhope_poly_ntt(&ep);
+
+    /* Generate the same |a| as the server, from the server's seed. */
+    NEWHOPE_POLY a;
+    const uint8_t *seed = &servermsg[POLY_BYTES];
+    newhope_poly_uniform(&a, seed);
+
+    NEWHOPE_POLY bp;
+    newhope_poly_pointwise(&bp, &a, &sp);
+    newhope_poly_add(&bp, &bp, &ep);
+    newhope_poly_tobytes(clientmsg, &bp);
+  }
 
   /* v = pk * s' + e'' */
   NEWHOPE_POLY v;
-  newhope_poly_pointwise(&v, &pk, &sp);
-  newhope_poly_invntt(&v);
-  newhope_poly_add(&v, &v, &epp);
+  {
+    NEWHOPE_POLY pk;
+    newhope_poly_frombytes(&pk, servermsg);
+
+    NEWHOPE_POLY epp;
+    newhope_poly_getnoise(&epp);
+
+    newhope_poly_pointwise(&v, &pk, &sp);
+    newhope_poly_invntt(&v);
+    newhope_poly_add(&v, &v, &epp);
+  }
 
   /* The second part of the client's message is the reconciliation data derived
    * from v. */