Merged SSH1 robustness changes from 0.55 release branch on to trunk.
[u/mdw/putty] / sshdh.c
diff --git a/sshdh.c b/sshdh.c
index 2e16bbe..af7eaf8 100644 (file)
--- a/sshdh.c
+++ b/sshdh.c
@@ -52,7 +52,7 @@ static void dh_init(struct dh_ctx *ctx)
  */
 void *dh_setup_group1(void)
 {
-    struct dh_ctx *ctx = smalloc(sizeof(struct dh_ctx));
+    struct dh_ctx *ctx = snew(struct dh_ctx);
     ctx->p = bignum_from_bytes(P, sizeof(P));
     ctx->g = bignum_from_bytes(G, sizeof(G));
     dh_init(ctx);
@@ -64,7 +64,7 @@ void *dh_setup_group1(void)
  */
 void *dh_setup_group(Bignum pval, Bignum gval)
 {
-    struct dh_ctx *ctx = smalloc(sizeof(struct dh_ctx));
+    struct dh_ctx *ctx = snew(struct dh_ctx);
     ctx->p = copybn(pval);
     ctx->g = copybn(gval);
     dh_init(ctx);
@@ -110,7 +110,7 @@ Bignum dh_create_e(void *handle, int nbits)
     unsigned char *buf;
 
     nbytes = ssh1_bignum_length(ctx->qmask);
-    buf = smalloc(nbytes);
+    buf = snewn(nbytes, unsigned char);
 
     do {
        /*
@@ -123,7 +123,7 @@ Bignum dh_create_e(void *handle, int nbits)
            ssh1_write_bignum(buf, ctx->qmask);
            for (i = 2; i < nbytes; i++)
                buf[i] &= random_byte();
-           ssh1_read_bignum(buf, &ctx->x);
+           ssh1_read_bignum(buf, nbytes, &ctx->x);   /* can't fail */
        } else {
            int b, nb;
            ctx->x = bn_power_2(nbits);
@@ -140,6 +140,8 @@ Bignum dh_create_e(void *handle, int nbits)
        }
     } while (bignum_cmp(ctx->x, One) <= 0 || bignum_cmp(ctx->x, ctx->q) >= 0);
 
+    sfree(buf);
+
     /*
      * Done. Now compute e = g^x mod p.
      */