diff --git a/tinycrypt/ecc.c b/tinycrypt/ecc.c
index 8eaa1e7..f7a6f06 100644
--- a/tinycrypt/ecc.c
+++ b/tinycrypt/ecc.c
@@ -285,7 +285,7 @@
  * (XYcZ_add_rnd() * and XYcZ_addC_rnd()) in scalar multiplication
  * (ECCPoint_mult()). Those go in pair, and each pair does 14 calls to
  * uECC_vli_mult_rnd() (6 in XYcZ_add_rnd() and 8 in XYcZ_addC_rnd(),
- * indirectly through uECC_vli_modMult_rnd() or uECC_vli_modSquare_rnd()).
+ * indirectly through uECC_vli_modMult_rnd().
  *
  * Considering this, in order to minimize the number of calls to the RNG
  * (which impact performance) while keeping the size of the structure low,
@@ -424,14 +424,6 @@
 	(void) r;
 }
 
-/* Computes result = left * right. Result must be 2 * num_words long. */
-static void uECC_vli_mult(uECC_word_t *result, const uECC_word_t *left,
-			  const uECC_word_t *right, wordcount_t num_words)
-{
-	(void) num_words;
-	uECC_vli_mult_rnd(result, left, right, NULL);
-}
-
 void uECC_vli_modAdd(uECC_word_t *result, const uECC_word_t *left,
 		     const uECC_word_t *right, const uECC_word_t *mod,
 		     wordcount_t num_words)
@@ -507,7 +499,7 @@
 		      wordcount_t num_words)
 {
 	uECC_word_t product[2 * NUM_ECC_WORDS];
-	uECC_vli_mult(product, left, right, num_words);
+	uECC_vli_mult_rnd(product, left, right, NULL);
 	uECC_vli_mmod(result, product, mod, num_words);
 }
 
@@ -524,26 +516,11 @@
 			   const uECC_word_t *right, uECC_Curve curve)
 {
 	uECC_word_t product[2 * NUM_ECC_WORDS];
-	uECC_vli_mult(product, left, right, curve->num_words);
+	uECC_vli_mult_rnd(product, left, right, NULL);
 
 	curve->mmod_fast(result, product);
 }
 
-static void uECC_vli_modSquare_rnd(uECC_word_t *result,
-				   const uECC_word_t *left,
-				   ecc_wait_state_t *s)
-{
-	uECC_vli_modMult_rnd(result, left, left, s);
-}
-
-static void uECC_vli_modSquare_fast(uECC_word_t *result,
-				    const uECC_word_t *left,
-				    uECC_Curve curve)
-{
-	uECC_vli_modMult_fast(result, left, left, curve);
-}
-
-
 #define EVEN(vli) (!(vli[0] & 1))
 
 static void vli_modInv_update(uECC_word_t *uv,
@@ -621,11 +598,11 @@
 		return;
 	}
 
-	uECC_vli_modSquare_fast(t4, Y1, curve);   /* t4 = y1^2 */
+	uECC_vli_modMult_fast(t4, Y1, Y1, curve);   /* t4 = y1^2 */
 	uECC_vli_modMult_fast(t5, X1, t4, curve); /* t5 = x1*y1^2 = A */
-	uECC_vli_modSquare_fast(t4, t4, curve);   /* t4 = y1^4 */
+	uECC_vli_modMult_fast(t4, t4, t4, curve);   /* t4 = y1^4 */
 	uECC_vli_modMult_fast(Y1, Y1, Z1, curve); /* t2 = y1*z1 = z3 */
-	uECC_vli_modSquare_fast(Z1, Z1, curve);   /* t3 = z1^2 */
+	uECC_vli_modMult_fast(Z1, Z1, Z1, curve);   /* t3 = z1^2 */
 
 	uECC_vli_modAdd(X1, X1, Z1, curve->p, num_words); /* t1 = x1 + z1^2 */
 	uECC_vli_modAdd(Z1, Z1, Z1, curve->p, num_words); /* t3 = 2*z1^2 */
@@ -643,7 +620,7 @@
 	}
 
 	/* t1 = 3/2*(x1^2 - z1^4) = B */
-	uECC_vli_modSquare_fast(Z1, X1, curve); /* t3 = B^2 */
+	uECC_vli_modMult_fast(Z1, X1, X1, curve); /* t3 = B^2 */
 	uECC_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - A */
 	uECC_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - 2A = x3 */
 	uECC_vli_modSub(t5, t5, Z1, curve->p, num_words); /* t5 = A - x3 */
@@ -663,7 +640,7 @@
 	uECC_word_t _3[NUM_ECC_WORDS] = {3}; /* -a = 3 */
 	wordcount_t num_words = curve->num_words;
 
-	uECC_vli_modSquare_fast(result, x, curve); /* r = x^2 */
+	uECC_vli_modMult_fast(result, x, x, curve); /* r = x^2 */
 	uECC_vli_modSub(result, result, _3, curve->p, num_words); /* r = x^2 - 3 */
 	uECC_vli_modMult_fast(result, result, x, curve); /* r = x^3 - 3x */
 	/* r = x^3 - 3x + b: */
@@ -786,7 +763,7 @@
 {
 	uECC_word_t t1[NUM_ECC_WORDS];
 
-	uECC_vli_modSquare_fast(t1, Z, curve);    /* z^2 */
+	uECC_vli_modMult_fast(t1, Z, Z, curve);    /* z^2 */
 	uECC_vli_modMult_fast(X1, X1, t1, curve); /* x1 * z^2 */
 	uECC_vli_modMult_fast(t1, t1, Z, curve);  /* z^3 */
 	uECC_vli_modMult_fast(Y1, Y1, t1, curve); /* y1 * z^3 */
@@ -825,11 +802,11 @@
 	const wordcount_t num_words = 8;
 
 	uECC_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */
-	uECC_vli_modSquare_rnd(t5, t5, s); /* t5 = (x2 - x1)^2 = A */
+	uECC_vli_modMult_rnd(t5, t5, t5, s); /* t5 = (x2 - x1)^2 = A */
 	uECC_vli_modMult_rnd(X1, X1, t5, s); /* t1 = x1*A = B */
 	uECC_vli_modMult_rnd(X2, X2, t5, s); /* t3 = x2*A = C */
 	uECC_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y2 - y1 */
-	uECC_vli_modSquare_rnd(t5, Y2, s); /* t5 = (y2 - y1)^2 = D */
+	uECC_vli_modMult_rnd(t5, Y2, Y2, s); /* t5 = (y2 - y1)^2 = D */
 
 	uECC_vli_modSub(t5, t5, X1, curve->p, num_words); /* t5 = D - B */
 	uECC_vli_modSub(t5, t5, X2, curve->p, num_words); /* t5 = D - B - C = x3 */
@@ -866,7 +843,7 @@
 	const wordcount_t num_words = 8;
 
 	uECC_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */
-	uECC_vli_modSquare_rnd(t5, t5, s); /* t5 = (x2 - x1)^2 = A */
+	uECC_vli_modMult_rnd(t5, t5, t5, s); /* t5 = (x2 - x1)^2 = A */
 	uECC_vli_modMult_rnd(X1, X1, t5, s); /* t1 = x1*A = B */
 	uECC_vli_modMult_rnd(X2, X2, t5, s); /* t3 = x2*A = C */
 	uECC_vli_modAdd(t5, Y2, Y1, curve->p, num_words); /* t5 = y2 + y1 */
@@ -875,7 +852,7 @@
 	uECC_vli_modSub(t6, X2, X1, curve->p, num_words); /* t6 = C - B */
 	uECC_vli_modMult_rnd(Y1, Y1, t6, s); /* t2 = y1 * (C - B) = E */
 	uECC_vli_modAdd(t6, X1, X2, curve->p, num_words); /* t6 = B + C */
-	uECC_vli_modSquare_rnd(X2, Y2, s); /* t3 = (y2 - y1)^2 = D */
+	uECC_vli_modMult_rnd(X2, Y2, Y2, s); /* t3 = (y2 - y1)^2 = D */
 	uECC_vli_modSub(X2, X2, t6, curve->p, num_words); /* t3 = D - (B + C) = x3 */
 
 	uECC_vli_modSub(t7, X1, X2, curve->p, num_words); /* t7 = B - x3 */
@@ -883,7 +860,7 @@
 	/* t4 = (y2 - y1)*(B - x3) - E = y3: */
 	uECC_vli_modSub(Y2, Y2, Y1, curve->p, num_words);
 
-	uECC_vli_modSquare_rnd(t7, t5, s); /* t7 = (y2 + y1)^2 = F */
+	uECC_vli_modMult_rnd(t7, t5, t5, s); /* t7 = (y2 + y1)^2 = F */
 	uECC_vli_modSub(t7, t7, t6, curve->p, num_words); /* t7 = F - (B + C) = x3' */
 	uECC_vli_modSub(t6, t7, X1, curve->p, num_words); /* t6 = x3' - B */
 	uECC_vli_modMult_rnd(t6, t6, t5, s); /* t6 = (y2+y1)*(x3' - B) */
@@ -1048,7 +1025,7 @@
 		return -2;
 	}
 
-	uECC_vli_modSquare_fast(tmp1, point + num_words, curve);
+	uECC_vli_modMult_fast(tmp1, point + num_words, point + num_words, curve);
 	curve->x_side(tmp2, point, curve); /* tmp2 = x^3 + ax + b */
 
 	/* Make sure that y^2 == x^3 + ax + b */
