Get rid of KEY_LENGTH_DWORDS_P192
Only KEY_LENGTH_DWORDS_P256 is used.
Test: compilation
Bug: 126463795
Change-Id: I32a80e4b012c4606a70994fa9d0b5c2602707bb3
diff --git a/system/stack/smp/p_256_curvepara.cc b/system/stack/smp/p_256_curvepara.cc
index 5fb71a3..ebdf266 100644
--- a/system/stack/smp/p_256_curvepara.cc
+++ b/system/stack/smp/p_256_curvepara.cc
@@ -25,53 +25,49 @@
#include <string.h>
#include "p_256_ecc_pp.h"
-void p_256_init_curve(uint32_t keyLength) {
- elliptic_curve_t* ec;
+void p_256_init_curve() {
+ elliptic_curve_t* ec = &curve_p256;
- if (keyLength == KEY_LENGTH_DWORDS_P256) {
- ec = &curve_p256;
+ ec->p[7] = 0xFFFFFFFF;
+ ec->p[6] = 0x00000001;
+ ec->p[5] = 0x0;
+ ec->p[4] = 0x0;
+ ec->p[3] = 0x0;
+ ec->p[2] = 0xFFFFFFFF;
+ ec->p[1] = 0xFFFFFFFF;
+ ec->p[0] = 0xFFFFFFFF;
- ec->p[7] = 0xFFFFFFFF;
- ec->p[6] = 0x00000001;
- ec->p[5] = 0x0;
- ec->p[4] = 0x0;
- ec->p[3] = 0x0;
- ec->p[2] = 0xFFFFFFFF;
- ec->p[1] = 0xFFFFFFFF;
- ec->p[0] = 0xFFFFFFFF;
+ memset(ec->omega, 0, KEY_LENGTH_DWORDS_P256);
+ memset(ec->a, 0, KEY_LENGTH_DWORDS_P256);
- memset(ec->omega, 0, KEY_LENGTH_DWORDS_P256);
- memset(ec->a, 0, KEY_LENGTH_DWORDS_P256);
+ ec->a_minus3 = true;
- ec->a_minus3 = true;
+ // b
+ ec->b[7] = 0x5ac635d8;
+ ec->b[6] = 0xaa3a93e7;
+ ec->b[5] = 0xb3ebbd55;
+ ec->b[4] = 0x769886bc;
+ ec->b[3] = 0x651d06b0;
+ ec->b[2] = 0xcc53b0f6;
+ ec->b[1] = 0x3bce3c3e;
+ ec->b[0] = 0x27d2604b;
- // b
- ec->b[7] = 0x5ac635d8;
- ec->b[6] = 0xaa3a93e7;
- ec->b[5] = 0xb3ebbd55;
- ec->b[4] = 0x769886bc;
- ec->b[3] = 0x651d06b0;
- ec->b[2] = 0xcc53b0f6;
- ec->b[1] = 0x3bce3c3e;
- ec->b[0] = 0x27d2604b;
+ // base point
+ ec->G.x[7] = 0x6b17d1f2;
+ ec->G.x[6] = 0xe12c4247;
+ ec->G.x[5] = 0xf8bce6e5;
+ ec->G.x[4] = 0x63a440f2;
+ ec->G.x[3] = 0x77037d81;
+ ec->G.x[2] = 0x2deb33a0;
+ ec->G.x[1] = 0xf4a13945;
+ ec->G.x[0] = 0xd898c296;
- // base point
- ec->G.x[7] = 0x6b17d1f2;
- ec->G.x[6] = 0xe12c4247;
- ec->G.x[5] = 0xf8bce6e5;
- ec->G.x[4] = 0x63a440f2;
- ec->G.x[3] = 0x77037d81;
- ec->G.x[2] = 0x2deb33a0;
- ec->G.x[1] = 0xf4a13945;
- ec->G.x[0] = 0xd898c296;
-
- ec->G.y[7] = 0x4fe342e2;
- ec->G.y[6] = 0xfe1a7f9b;
- ec->G.y[5] = 0x8ee7eb4a;
- ec->G.y[4] = 0x7c0f9e16;
- ec->G.y[3] = 0x2bce3357;
- ec->G.y[2] = 0x6b315ece;
- ec->G.y[1] = 0xcbb64068;
- ec->G.y[0] = 0x37bf51f5;
- }
+ ec->G.y[7] = 0x4fe342e2;
+ ec->G.y[6] = 0xfe1a7f9b;
+ ec->G.y[5] = 0x8ee7eb4a;
+ ec->G.y[4] = 0x7c0f9e16;
+ ec->G.y[3] = 0x2bce3357;
+ ec->G.y[2] = 0x6b315ece;
+ ec->G.y[1] = 0xcbb64068;
+ ec->G.y[0] = 0x37bf51f5;
}
diff --git a/system/stack/smp/p_256_ecc_pp.cc b/system/stack/smp/p_256_ecc_pp.cc
index ff5dbde..cef368a 100644
--- a/system/stack/smp/p_256_ecc_pp.cc
+++ b/system/stack/smp/p_256_ecc_pp.cc
@@ -38,7 +38,7 @@
}
// q=2q
-static void ECC_Double(Point* q, Point* p, uint32_t keyLength) {
+static void ECC_Double(Point* q, Point* p) {
uint32_t t1[KEY_LENGTH_DWORDS_P256];
uint32_t t2[KEY_LENGTH_DWORDS_P256];
uint32_t t3[KEY_LENGTH_DWORDS_P256];
@@ -49,8 +49,8 @@
uint32_t* z1;
uint32_t* z3;
- if (multiprecision_iszero(p->z, keyLength)) {
- multiprecision_init(q->z, keyLength);
+ if (multiprecision_iszero(p->z)) {
+ multiprecision_init(q->z);
return; // return infinity
}
@@ -61,33 +61,33 @@
y3 = q->y;
z3 = q->z;
- multiprecision_mersenns_squa_mod(t1, z1, keyLength); // t1=z1^2
- multiprecision_sub_mod(t2, x1, t1, keyLength); // t2=x1-t1
- multiprecision_add_mod(t1, x1, t1, keyLength); // t1=x1+t1
- multiprecision_mersenns_mult_mod(t2, t1, t2, keyLength); // t2=t2*t1
- multiprecision_lshift_mod(t3, t2, keyLength);
- multiprecision_add_mod(t2, t3, t2, keyLength); // t2=3t2
+ multiprecision_mersenns_squa_mod(t1, z1); // t1=z1^2
+ multiprecision_sub_mod(t2, x1, t1); // t2=x1-t1
+ multiprecision_add_mod(t1, x1, t1); // t1=x1+t1
+ multiprecision_mersenns_mult_mod(t2, t1, t2); // t2=t2*t1
+ multiprecision_lshift_mod(t3, t2);
+ multiprecision_add_mod(t2, t3, t2); // t2=3t2
- multiprecision_mersenns_mult_mod(z3, y1, z1, keyLength); // z3=y1*z1
- multiprecision_lshift_mod(z3, z3, keyLength);
+ multiprecision_mersenns_mult_mod(z3, y1, z1); // z3=y1*z1
+ multiprecision_lshift_mod(z3, z3);
- multiprecision_mersenns_squa_mod(y3, y1, keyLength); // y3=y1^2
- multiprecision_lshift_mod(y3, y3, keyLength);
- multiprecision_mersenns_mult_mod(t3, y3, x1, keyLength); // t3=y3*x1=x1*y1^2
- multiprecision_lshift_mod(t3, t3, keyLength);
- multiprecision_mersenns_squa_mod(y3, y3, keyLength); // y3=y3^2=y1^4
- multiprecision_lshift_mod(y3, y3, keyLength);
+ multiprecision_mersenns_squa_mod(y3, y1); // y3=y1^2
+ multiprecision_lshift_mod(y3, y3);
+ multiprecision_mersenns_mult_mod(t3, y3, x1); // t3=y3*x1=x1*y1^2
+ multiprecision_lshift_mod(t3, t3);
+ multiprecision_mersenns_squa_mod(y3, y3); // y3=y3^2=y1^4
+ multiprecision_lshift_mod(y3, y3);
- multiprecision_mersenns_squa_mod(x3, t2, keyLength); // x3=t2^2
- multiprecision_lshift_mod(t1, t3, keyLength); // t1=2t3
- multiprecision_sub_mod(x3, x3, t1, keyLength); // x3=x3-t1
- multiprecision_sub_mod(t1, t3, x3, keyLength); // t1=t3-x3
- multiprecision_mersenns_mult_mod(t1, t1, t2, keyLength); // t1=t1*t2
- multiprecision_sub_mod(y3, t1, y3, keyLength); // y3=t1-y3
+ multiprecision_mersenns_squa_mod(x3, t2); // x3=t2^2
+ multiprecision_lshift_mod(t1, t3); // t1=2t3
+ multiprecision_sub_mod(x3, x3, t1); // x3=x3-t1
+ multiprecision_sub_mod(t1, t3, x3); // t1=t3-x3
+ multiprecision_mersenns_mult_mod(t1, t1, t2); // t1=t1*t2
+ multiprecision_sub_mod(y3, t1, y3); // y3=t1-y3
}
// q=q+p, zp must be 1
-static void ECC_Add(Point* r, Point* p, Point* q, uint32_t keyLength) {
+static void ECC_Add(Point* r, Point* p, Point* q) {
uint32_t t1[KEY_LENGTH_DWORDS_P256];
uint32_t t2[KEY_LENGTH_DWORDS_P256];
uint32_t* x1;
@@ -111,58 +111,57 @@
z3 = r->z;
// if Q=infinity, return p
- if (multiprecision_iszero(z2, keyLength)) {
+ if (multiprecision_iszero(z2)) {
p_256_copy_point(r, p);
return;
}
// if P=infinity, return q
- if (multiprecision_iszero(z1, keyLength)) {
+ if (multiprecision_iszero(z1)) {
p_256_copy_point(r, q);
return;
}
- multiprecision_mersenns_squa_mod(t1, z1, keyLength); // t1=z1^2
- multiprecision_mersenns_mult_mod(t2, z1, t1, keyLength); // t2=t1*z1
- multiprecision_mersenns_mult_mod(t1, x2, t1, keyLength); // t1=t1*x2
- multiprecision_mersenns_mult_mod(t2, y2, t2, keyLength); // t2=t2*y2
+ multiprecision_mersenns_squa_mod(t1, z1); // t1=z1^2
+ multiprecision_mersenns_mult_mod(t2, z1, t1); // t2=t1*z1
+ multiprecision_mersenns_mult_mod(t1, x2, t1); // t1=t1*x2
+ multiprecision_mersenns_mult_mod(t2, y2, t2); // t2=t2*y2
- multiprecision_sub_mod(t1, t1, x1, keyLength); // t1=t1-x1
- multiprecision_sub_mod(t2, t2, y1, keyLength); // t2=t2-y1
+ multiprecision_sub_mod(t1, t1, x1); // t1=t1-x1
+ multiprecision_sub_mod(t2, t2, y1); // t2=t2-y1
- if (multiprecision_iszero(t1, keyLength)) {
- if (multiprecision_iszero(t2, keyLength)) {
- ECC_Double(r, q, keyLength);
+ if (multiprecision_iszero(t1)) {
+ if (multiprecision_iszero(t2)) {
+ ECC_Double(r, q);
return;
} else {
- multiprecision_init(z3, keyLength);
+ multiprecision_init(z3);
return; // return infinity
}
}
- multiprecision_mersenns_mult_mod(z3, z1, t1, keyLength); // z3=z1*t1
- multiprecision_mersenns_squa_mod(y3, t1, keyLength); // t3=t1^2
- multiprecision_mersenns_mult_mod(z1, y3, t1, keyLength); // t4=t3*t1
- multiprecision_mersenns_mult_mod(y3, y3, x1, keyLength); // t3=t3*x1
- multiprecision_lshift_mod(t1, y3, keyLength); // t1=2*t3
- multiprecision_mersenns_squa_mod(x3, t2, keyLength); // x3=t2^2
- multiprecision_sub_mod(x3, x3, t1, keyLength); // x3=x3-t1
- multiprecision_sub_mod(x3, x3, z1, keyLength); // x3=x3-t4
- multiprecision_sub_mod(y3, y3, x3, keyLength); // t3=t3-x3
- multiprecision_mersenns_mult_mod(y3, y3, t2, keyLength); // t3=t3*t2
- multiprecision_mersenns_mult_mod(z1, z1, y1, keyLength); // t4=t4*t1
- multiprecision_sub_mod(y3, y3, z1, keyLength);
+ multiprecision_mersenns_mult_mod(z3, z1, t1); // z3=z1*t1
+ multiprecision_mersenns_squa_mod(y3, t1); // t3=t1^2
+ multiprecision_mersenns_mult_mod(z1, y3, t1); // t4=t3*t1
+ multiprecision_mersenns_mult_mod(y3, y3, x1); // t3=t3*x1
+ multiprecision_lshift_mod(t1, y3); // t1=2*t3
+ multiprecision_mersenns_squa_mod(x3, t2); // x3=t2^2
+ multiprecision_sub_mod(x3, x3, t1); // x3=x3-t1
+ multiprecision_sub_mod(x3, x3, z1); // x3=x3-t4
+ multiprecision_sub_mod(y3, y3, x3); // t3=t3-x3
+ multiprecision_mersenns_mult_mod(y3, y3, t2); // t3=t3*t2
+ multiprecision_mersenns_mult_mod(z1, z1, y1); // t4=t4*t1
+ multiprecision_sub_mod(y3, y3, z1);
}
// Computing the Non-Adjacent Form of a positive integer
-static void ECC_NAF(uint8_t* naf, uint32_t* NumNAF, uint32_t* k,
- uint32_t keyLength) {
+static void ECC_NAF(uint8_t* naf, uint32_t* NumNAF, uint32_t* k) {
uint32_t sign;
int i = 0;
int j;
uint32_t var;
- while ((var = multiprecision_most_signbits(k, keyLength)) >= 1) {
+ while ((var = multiprecision_most_signbits(k)) >= 1) {
if (k[0] & 0x01) // k is odd
{
sign = (k[0] & 0x03); // 1 or 3
@@ -183,7 +182,7 @@
} else
sign = 0;
- multiprecision_rshift(k, k, keyLength);
+ multiprecision_rshift(k, k);
naf[i / 4] |= (sign) << ((i % 4) * 2);
i++;
}
@@ -192,8 +191,7 @@
}
// Binary Non-Adjacent Form for point multiplication
-void ECC_PointMult_Bin_NAF(Point* q, Point* p, uint32_t* n,
- uint32_t keyLength) {
+void ECC_PointMult_Bin_NAF(Point* q, Point* p, uint32_t* n) {
uint32_t sign;
uint8_t naf[256 / 4 + 1];
uint32_t NumNaf;
@@ -201,69 +199,64 @@
Point r;
uint32_t* modp;
- if (keyLength == KEY_LENGTH_DWORDS_P256) {
- modp = curve_p256.p;
- } else {
- modp = curve.p;
- }
+ modp = curve_p256.p;
p_256_init_point(&r);
- multiprecision_init(p->z, keyLength);
+ multiprecision_init(p->z);
p->z[0] = 1;
// initialization
p_256_init_point(q);
// -p
- multiprecision_copy(minus_p.x, p->x, keyLength);
- multiprecision_sub(minus_p.y, modp, p->y, keyLength);
+ multiprecision_copy(minus_p.x, p->x);
+ multiprecision_sub(minus_p.y, modp, p->y);
- multiprecision_init(minus_p.z, keyLength);
+ multiprecision_init(minus_p.z);
minus_p.z[0] = 1;
// NAF
memset(naf, 0, sizeof(naf));
- ECC_NAF(naf, &NumNaf, n, keyLength);
+ ECC_NAF(naf, &NumNaf, n);
for (int i = NumNaf - 1; i >= 0; i--) {
p_256_copy_point(&r, q);
- ECC_Double(q, &r, keyLength);
+ ECC_Double(q, &r);
sign = (naf[i / 4] >> ((i % 4) * 2)) & 0x03;
if (sign == 1) {
p_256_copy_point(&r, q);
- ECC_Add(q, &r, p, keyLength);
+ ECC_Add(q, &r, p);
} else if (sign == 3) {
p_256_copy_point(&r, q);
- ECC_Add(q, &r, &minus_p, keyLength);
+ ECC_Add(q, &r, &minus_p);
}
}
- multiprecision_inv_mod(minus_p.x, q->z, keyLength);
- multiprecision_mersenns_squa_mod(q->z, minus_p.x, keyLength);
- multiprecision_mersenns_mult_mod(q->x, q->x, q->z, keyLength);
- multiprecision_mersenns_mult_mod(q->z, q->z, minus_p.x, keyLength);
- multiprecision_mersenns_mult_mod(q->y, q->y, q->z, keyLength);
+ multiprecision_inv_mod(minus_p.x, q->z);
+ multiprecision_mersenns_squa_mod(q->z, minus_p.x);
+ multiprecision_mersenns_mult_mod(q->x, q->x, q->z);
+ multiprecision_mersenns_mult_mod(q->z, q->z, minus_p.x);
+ multiprecision_mersenns_mult_mod(q->y, q->y, q->z);
}
bool ECC_ValidatePoint(const Point& pt) {
- const size_t kl = KEY_LENGTH_DWORDS_P256;
- p_256_init_curve(kl);
+ p_256_init_curve();
// Ensure y^2 = x^3 + a*x + b (mod p); a = -3
// y^2 mod p
- uint32_t y2_mod[kl] = {0};
- multiprecision_mersenns_squa_mod(y2_mod, (uint32_t*)pt.y, kl);
+ uint32_t y2_mod[KEY_LENGTH_DWORDS_P256] = {0};
+ multiprecision_mersenns_squa_mod(y2_mod, (uint32_t*)pt.y);
// Right hand side calculation
- uint32_t rhs[kl] = {0};
- multiprecision_mersenns_squa_mod(rhs, (uint32_t*)pt.x, kl);
- uint32_t three[kl] = {0};
+ uint32_t rhs[KEY_LENGTH_DWORDS_P256] = {0};
+ multiprecision_mersenns_squa_mod(rhs, (uint32_t*)pt.x);
+ uint32_t three[KEY_LENGTH_DWORDS_P256] = {0};
three[0] = 3;
- multiprecision_sub_mod(rhs, rhs, three, kl);
- multiprecision_mersenns_mult_mod(rhs, rhs, (uint32_t*)pt.x, kl);
- multiprecision_add_mod(rhs, rhs, curve_p256.b, kl);
+ multiprecision_sub_mod(rhs, rhs, three);
+ multiprecision_mersenns_mult_mod(rhs, rhs, (uint32_t*)pt.x);
+ multiprecision_add_mod(rhs, rhs, curve_p256.b);
- return multiprecision_compare(rhs, y2_mod, kl) == 0;
+ return multiprecision_compare(rhs, y2_mod) == 0;
}
diff --git a/system/stack/smp/p_256_ecc_pp.h b/system/stack/smp/p_256_ecc_pp.h
index b49b72a..4dff0a8 100644
--- a/system/stack/smp/p_256_ecc_pp.h
+++ b/system/stack/smp/p_256_ecc_pp.h
@@ -58,9 +58,8 @@
bool ECC_ValidatePoint(const Point& p);
-void ECC_PointMult_Bin_NAF(Point* q, Point* p, uint32_t* n, uint32_t keyLength);
+void ECC_PointMult_Bin_NAF(Point* q, Point* p, uint32_t* n);
-#define ECC_PointMult(q, p, n, keyLength) \
- ECC_PointMult_Bin_NAF(q, p, n, keyLength)
+#define ECC_PointMult(q, p, n) ECC_PointMult_Bin_NAF(q, p, n)
-void p_256_init_curve(uint32_t keyLength);
+void p_256_init_curve();
diff --git a/system/stack/smp/p_256_multprecision.cc b/system/stack/smp/p_256_multprecision.cc
index 286aca1..0310829 100644
--- a/system/stack/smp/p_256_multprecision.cc
+++ b/system/stack/smp/p_256_multprecision.cc
@@ -27,24 +27,24 @@
#include "bt_target.h"
#include "p_256_ecc_pp.h"
-void multiprecision_init(uint32_t* c, uint32_t keyLength) {
- for (uint32_t i = 0; i < keyLength; i++) c[i] = 0;
+void multiprecision_init(uint32_t* c) {
+ for (uint32_t i = 0; i < KEY_LENGTH_DWORDS_P256; i++) c[i] = 0;
}
-void multiprecision_copy(uint32_t* c, uint32_t* a, uint32_t keyLength) {
- for (uint32_t i = 0; i < keyLength; i++) c[i] = a[i];
+void multiprecision_copy(uint32_t* c, uint32_t* a) {
+ for (uint32_t i = 0; i < KEY_LENGTH_DWORDS_P256; i++) c[i] = a[i];
}
-int multiprecision_compare(uint32_t* a, uint32_t* b, uint32_t keyLength) {
- for (int i = keyLength - 1; i >= 0; i--) {
+int multiprecision_compare(uint32_t* a, uint32_t* b) {
+ for (int i = KEY_LENGTH_DWORDS_P256 - 1; i >= 0; i--) {
if (a[i] > b[i]) return 1;
if (a[i] < b[i]) return -1;
}
return 0;
}
-int multiprecision_iszero(uint32_t* a, uint32_t keyLength) {
- for (uint32_t i = 0; i < keyLength; i++)
+int multiprecision_iszero(uint32_t* a) {
+ for (uint32_t i = 0; i < KEY_LENGTH_DWORDS_P256; i++)
if (a[i]) return 0;
return 1;
@@ -58,30 +58,29 @@
return i;
}
-uint32_t multiprecision_most_signdwords(uint32_t* a, uint32_t keyLength) {
+uint32_t multiprecision_most_signdwords(uint32_t* a) {
int i;
- for (i = keyLength - 1; i >= 0; i--)
+ for (i = KEY_LENGTH_DWORDS_P256 - 1; i >= 0; i--)
if (a[i]) break;
return (i + 1);
}
-uint32_t multiprecision_most_signbits(uint32_t* a, uint32_t keyLength) {
+uint32_t multiprecision_most_signbits(uint32_t* a) {
int aMostSignDWORDs;
- aMostSignDWORDs = multiprecision_most_signdwords(a, keyLength);
+ aMostSignDWORDs = multiprecision_most_signdwords(a);
if (aMostSignDWORDs == 0) return 0;
return (((aMostSignDWORDs - 1) << DWORD_BITS_SHIFT) +
multiprecision_dword_bits(a[aMostSignDWORDs - 1]));
}
-uint32_t multiprecision_add(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength) {
+uint32_t multiprecision_add(uint32_t* c, uint32_t* a, uint32_t* b) {
uint32_t carrier;
uint32_t temp;
carrier = 0;
- for (uint32_t i = 0; i < keyLength; i++) {
+ for (uint32_t i = 0; i < KEY_LENGTH_DWORDS_P256; i++) {
temp = a[i] + carrier;
carrier = (temp < carrier);
temp += b[i];
@@ -93,13 +92,12 @@
}
// c=a-b
-uint32_t multiprecision_sub(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength) {
+uint32_t multiprecision_sub(uint32_t* c, uint32_t* a, uint32_t* b) {
uint32_t borrow;
uint32_t temp;
borrow = 0;
- for (uint32_t i = 0; i < keyLength; i++) {
+ for (uint32_t i = 0; i < KEY_LENGTH_DWORDS_P256; i++) {
temp = a[i] - borrow;
borrow = (temp > a[i]);
c[i] = temp - b[i];
@@ -110,27 +108,20 @@
}
// c = a << 1
-void multiprecision_lshift_mod(uint32_t* c, uint32_t* a, uint32_t keyLength) {
+void multiprecision_lshift_mod(uint32_t* c, uint32_t* a) {
uint32_t carrier;
- uint32_t* modp;
+ uint32_t* modp = curve_p256.p;
- if (keyLength == KEY_LENGTH_DWORDS_P192) {
- modp = curve.p;
- } else if (keyLength == KEY_LENGTH_DWORDS_P256) {
- modp = curve_p256.p;
- } else
- return;
-
- carrier = multiprecision_lshift(c, a, keyLength);
+ carrier = multiprecision_lshift(c, a);
if (carrier) {
- multiprecision_sub(c, c, modp, keyLength);
- } else if (multiprecision_compare(c, modp, keyLength) >= 0) {
- multiprecision_sub(c, c, modp, keyLength);
+ multiprecision_sub(c, c, modp);
+ } else if (multiprecision_compare(c, modp) >= 0) {
+ multiprecision_sub(c, c, modp);
}
}
// c=a>>1
-void multiprecision_rshift(uint32_t* c, uint32_t* a, uint32_t keyLength) {
+void multiprecision_rshift(uint32_t* c, uint32_t* a) {
int j;
uint32_t b = 1;
@@ -138,7 +129,7 @@
uint32_t carrier = 0;
uint32_t temp;
- for (int i = keyLength - 1; i >= 0; i--) {
+ for (int i = KEY_LENGTH_DWORDS_P256 - 1; i >= 0; i--) {
temp = a[i]; // in case of c==a
c[i] = (temp >> b) | carrier;
carrier = temp << j;
@@ -147,64 +138,42 @@
// Curve specific optimization when p is a pseudo-Mersenns prime,
// p=2^(KEY_LENGTH_BITS)-omega
-void multiprecision_mersenns_mult_mod(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength) {
+void multiprecision_mersenns_mult_mod(uint32_t* c, uint32_t* a, uint32_t* b) {
uint32_t cc[2 * KEY_LENGTH_DWORDS_P256];
- multiprecision_mult(cc, a, b, keyLength);
- if (keyLength == 6) {
- multiprecision_fast_mod(c, cc);
- } else if (keyLength == 8) {
- multiprecision_fast_mod_P256(c, cc);
- }
+ multiprecision_mult(cc, a, b);
+ multiprecision_fast_mod_P256(c, cc);
}
// Curve specific optimization when p is a pseudo-Mersenns prime
-void multiprecision_mersenns_squa_mod(uint32_t* c, uint32_t* a,
- uint32_t keyLength) {
- multiprecision_mersenns_mult_mod(c, a, a, keyLength);
+void multiprecision_mersenns_squa_mod(uint32_t* c, uint32_t* a) {
+ multiprecision_mersenns_mult_mod(c, a, a);
}
// c=(a+b) mod p, b<p, a<p
-void multiprecision_add_mod(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength) {
+void multiprecision_add_mod(uint32_t* c, uint32_t* a, uint32_t* b) {
uint32_t carrier;
- uint32_t* modp;
+ uint32_t* modp = curve_p256.p;
- if (keyLength == KEY_LENGTH_DWORDS_P192) {
- modp = curve.p;
- } else if (keyLength == KEY_LENGTH_DWORDS_P256) {
- modp = curve_p256.p;
- } else
- return;
-
- carrier = multiprecision_add(c, a, b, keyLength);
+ carrier = multiprecision_add(c, a, b);
if (carrier) {
- multiprecision_sub(c, c, modp, keyLength);
- } else if (multiprecision_compare(c, modp, keyLength) >= 0) {
- multiprecision_sub(c, c, modp, keyLength);
+ multiprecision_sub(c, c, modp);
+ } else if (multiprecision_compare(c, modp) >= 0) {
+ multiprecision_sub(c, c, modp);
}
}
// c=(a-b) mod p, a<p, b<p
-void multiprecision_sub_mod(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength) {
+void multiprecision_sub_mod(uint32_t* c, uint32_t* a, uint32_t* b) {
uint32_t borrow;
- uint32_t* modp;
+ uint32_t* modp = curve_p256.p;
- if (keyLength == KEY_LENGTH_DWORDS_P192) {
- modp = curve.p;
- } else if (keyLength == KEY_LENGTH_DWORDS_P256) {
- modp = curve_p256.p;
- } else
- return;
-
- borrow = multiprecision_sub(c, a, b, keyLength);
- if (borrow) multiprecision_add(c, c, modp, keyLength);
+ borrow = multiprecision_sub(c, a, b);
+ if (borrow) multiprecision_add(c, c, modp);
}
// c=a<<b, b<DWORD_BITS, c has a buffer size of Numuint32_ts+1
-uint32_t multiprecision_lshift(uint32_t* c, uint32_t* a, uint32_t keyLength) {
+uint32_t multiprecision_lshift(uint32_t* c, uint32_t* a) {
int j;
uint32_t b = 1;
j = DWORD_BITS - b;
@@ -212,7 +181,7 @@
uint32_t carrier = 0;
uint32_t temp;
- for (uint32_t i = 0; i < keyLength; i++) {
+ for (uint32_t i = 0; i < KEY_LENGTH_DWORDS_P256; i++) {
temp = a[i]; // in case c==a
c[i] = (temp << b) | carrier;
carrier = temp >> j;
@@ -222,19 +191,18 @@
}
// c=a*b; c must have a buffer of 2*Key_LENGTH_uint32_tS, c != a != b
-void multiprecision_mult(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength) {
+void multiprecision_mult(uint32_t* c, uint32_t* a, uint32_t* b) {
uint32_t W;
uint32_t U;
uint32_t V;
U = V = W = 0;
- multiprecision_init(c, keyLength);
+ multiprecision_init(c);
// assume little endian right now
- for (uint32_t i = 0; i < keyLength; i++) {
+ for (uint32_t i = 0; i < KEY_LENGTH_DWORDS_P256; i++) {
U = 0;
- for (uint32_t j = 0; j < keyLength; j++) {
+ for (uint32_t j = 0; j < KEY_LENGTH_DWORDS_P256; j++) {
uint64_t result;
result = ((uint64_t)a[i]) * ((uint64_t)b[j]);
W = result >> 32;
@@ -246,78 +214,7 @@
U += (V < c[i + j]);
c[i + j] = V;
}
- c[i + keyLength] = U;
- }
-}
-
-void multiprecision_fast_mod(uint32_t* c, uint32_t* a) {
- uint32_t U;
- uint32_t V;
- uint32_t* modp = curve.p;
-
- c[0] = a[0] + a[6];
- U = c[0] < a[0];
- c[0] += a[10];
- U += c[0] < a[10];
-
- c[1] = a[1] + U;
- U = c[1] < a[1];
- c[1] += a[7];
- U += c[1] < a[7];
- c[1] += a[11];
- U += c[1] < a[11];
-
- c[2] = a[2] + U;
- U = c[2] < a[2];
- c[2] += a[6];
- U += c[2] < a[6];
- c[2] += a[8];
- U += c[2] < a[8];
- c[2] += a[10];
- U += c[2] < a[10];
-
- c[3] = a[3] + U;
- U = c[3] < a[3];
- c[3] += a[7];
- U += c[3] < a[7];
- c[3] += a[9];
- U += c[3] < a[9];
- c[3] += a[11];
- U += c[3] < a[11];
-
- c[4] = a[4] + U;
- U = c[4] < a[4];
- c[4] += a[8];
- U += c[4] < a[8];
- c[4] += a[10];
- U += c[4] < a[10];
-
- c[5] = a[5] + U;
- U = c[5] < a[5];
- c[5] += a[9];
- U += c[5] < a[9];
- c[5] += a[11];
- U += c[5] < a[11];
-
- c[0] += U;
- V = c[0] < U;
- c[1] += V;
- V = c[1] < V;
- c[2] += V;
- V = c[2] < V;
- c[2] += U;
- V = c[2] < U;
- c[3] += V;
- V = c[3] < V;
- c[4] += V;
- V = c[4] < V;
- c[5] += V;
- V = c[5] < V;
-
- if (V) {
- multiprecision_sub(c, c, modp, KEY_LENGTH_DWORDS_P192);
- } else if (multiprecision_compare(c, modp, KEY_LENGTH_DWORDS_P192) >= 0) {
- multiprecision_sub(c, c, modp, KEY_LENGTH_DWORDS_P192);
+ c[i + KEY_LENGTH_DWORDS_P256] = U;
}
}
@@ -541,74 +438,67 @@
if (U & 0x80000000) {
while (U) {
- multiprecision_add(c, c, modp, KEY_LENGTH_DWORDS_P256);
+ multiprecision_add(c, c, modp);
U++;
}
} else if (U) {
while (U) {
- multiprecision_sub(c, c, modp, KEY_LENGTH_DWORDS_P256);
+ multiprecision_sub(c, c, modp);
U--;
}
}
- if (multiprecision_compare(c, modp, KEY_LENGTH_DWORDS_P256) >= 0)
- multiprecision_sub(c, c, modp, KEY_LENGTH_DWORDS_P256);
+ if (multiprecision_compare(c, modp) >= 0) multiprecision_sub(c, c, modp);
}
-void multiprecision_inv_mod(uint32_t* aminus, uint32_t* u, uint32_t keyLength) {
+void multiprecision_inv_mod(uint32_t* aminus, uint32_t* u) {
uint32_t v[KEY_LENGTH_DWORDS_P256];
uint32_t A[KEY_LENGTH_DWORDS_P256 + 1];
uint32_t C[KEY_LENGTH_DWORDS_P256 + 1];
- uint32_t* modp;
+ uint32_t* modp = curve_p256.p;
- if (keyLength == KEY_LENGTH_DWORDS_P256) {
- modp = curve_p256.p;
- } else {
- modp = curve.p;
- }
-
- multiprecision_copy(v, modp, keyLength);
- multiprecision_init(A, keyLength);
- multiprecision_init(C, keyLength);
+ multiprecision_copy(v, modp);
+ multiprecision_init(A);
+ multiprecision_init(C);
A[0] = 1;
- while (!multiprecision_iszero(u, keyLength)) {
+ while (!multiprecision_iszero(u)) {
while (!(u[0] & 0x01)) // u is even
{
- multiprecision_rshift(u, u, keyLength);
+ multiprecision_rshift(u, u);
if (!(A[0] & 0x01)) // A is even
- multiprecision_rshift(A, A, keyLength);
+ multiprecision_rshift(A, A);
else {
- A[keyLength] = multiprecision_add(A, A, modp, keyLength); // A =A+p
- multiprecision_rshift(A, A, keyLength);
- A[keyLength - 1] |= (A[keyLength] << 31);
+ A[KEY_LENGTH_DWORDS_P256] = multiprecision_add(A, A, modp); // A =A+p
+ multiprecision_rshift(A, A);
+ A[KEY_LENGTH_DWORDS_P256 - 1] |= (A[KEY_LENGTH_DWORDS_P256] << 31);
}
}
while (!(v[0] & 0x01)) // v is even
{
- multiprecision_rshift(v, v, keyLength);
+ multiprecision_rshift(v, v);
if (!(C[0] & 0x01)) // C is even
{
- multiprecision_rshift(C, C, keyLength);
+ multiprecision_rshift(C, C);
} else {
- C[keyLength] = multiprecision_add(C, C, modp, keyLength); // C =C+p
- multiprecision_rshift(C, C, keyLength);
- C[keyLength - 1] |= (C[keyLength] << 31);
+ C[KEY_LENGTH_DWORDS_P256] = multiprecision_add(C, C, modp); // C =C+p
+ multiprecision_rshift(C, C);
+ C[KEY_LENGTH_DWORDS_P256 - 1] |= (C[KEY_LENGTH_DWORDS_P256] << 31);
}
}
- if (multiprecision_compare(u, v, keyLength) >= 0) {
- multiprecision_sub(u, u, v, keyLength);
- multiprecision_sub_mod(A, A, C, keyLength);
+ if (multiprecision_compare(u, v) >= 0) {
+ multiprecision_sub(u, u, v);
+ multiprecision_sub_mod(A, A, C);
} else {
- multiprecision_sub(v, v, u, keyLength);
- multiprecision_sub_mod(C, C, A, keyLength);
+ multiprecision_sub(v, v, u);
+ multiprecision_sub_mod(C, C, A);
}
}
- if (multiprecision_compare(C, modp, keyLength) >= 0)
- multiprecision_sub(aminus, C, modp, keyLength);
+ if (multiprecision_compare(C, modp) >= 0)
+ multiprecision_sub(aminus, C, modp);
else
- multiprecision_copy(aminus, C, keyLength);
+ multiprecision_copy(aminus, C);
}
diff --git a/system/stack/smp/p_256_multprecision.h b/system/stack/smp/p_256_multprecision.h
index fbbd88d..a98fe4d 100644
--- a/system/stack/smp/p_256_multprecision.h
+++ b/system/stack/smp/p_256_multprecision.h
@@ -12,8 +12,7 @@
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
- * limitations under the License.
- *
+ * limitations under the License. *
******************************************************************************/
/*******************************************************************************
@@ -29,40 +28,30 @@
#define DWORD_BYTES 4
#define DWORD_BITS_SHIFT 5
-#define KEY_LENGTH_DWORDS_P192 6
#define KEY_LENGTH_DWORDS_P256 8
/* Arithmetic Operations */
-int multiprecision_compare(uint32_t* a, uint32_t* b, uint32_t keyLength);
-int multiprecision_iszero(uint32_t* a, uint32_t keyLength);
-void multiprecision_init(uint32_t* c, uint32_t keyLength);
-void multiprecision_copy(uint32_t* c, uint32_t* a, uint32_t keyLength);
+int multiprecision_compare(uint32_t* a, uint32_t* b);
+int multiprecision_iszero(uint32_t* a);
+void multiprecision_init(uint32_t* c);
+void multiprecision_copy(uint32_t* c, uint32_t* a);
uint32_t multiprecision_dword_bits(uint32_t a);
-uint32_t multiprecision_most_signdwords(uint32_t* a, uint32_t keyLength);
-uint32_t multiprecision_most_signbits(uint32_t* a, uint32_t keyLength);
-void multiprecision_inv_mod(uint32_t* aminus, uint32_t* a, uint32_t keyLength);
-uint32_t multiprecision_add(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength); // c=a+b
-void multiprecision_add_mod(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength);
-uint32_t multiprecision_sub(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength); // c=a-b
-void multiprecision_sub_mod(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength);
-void multiprecision_rshift(uint32_t* c, uint32_t* a,
- uint32_t keyLength); // c=a>>1, return carrier
-void multiprecision_lshift_mod(uint32_t* c, uint32_t* a,
- uint32_t keyLength); // c=a<<b, return carrier
-uint32_t multiprecision_lshift(uint32_t* c, uint32_t* a,
- uint32_t keyLength); // c=a<<b, return carrier
-void multiprecision_mult(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength); // c=a*b
-void multiprecision_mersenns_mult_mod(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength);
-void multiprecision_mersenns_squa_mod(uint32_t* c, uint32_t* a,
- uint32_t keyLength);
-uint32_t multiprecision_lshift(uint32_t* c, uint32_t* a, uint32_t keyLength);
-void multiprecision_mult(uint32_t* c, uint32_t* a, uint32_t* b,
- uint32_t keyLength);
+uint32_t multiprecision_most_signdwords(uint32_t* a);
+uint32_t multiprecision_most_signbits(uint32_t* a);
+void multiprecision_inv_mod(uint32_t* aminus, uint32_t* a);
+uint32_t multiprecision_add(uint32_t* c, uint32_t* a, uint32_t* b); // c=a+b
+void multiprecision_add_mod(uint32_t* c, uint32_t* a, uint32_t* b);
+uint32_t multiprecision_sub(uint32_t* c, uint32_t* a, uint32_t* b); // c=a-b
+void multiprecision_sub_mod(uint32_t* c, uint32_t* a, uint32_t* b);
+void multiprecision_rshift(uint32_t* c, uint32_t* a); // c=a>>1, return carrier
+void multiprecision_lshift_mod(uint32_t* c,
+ uint32_t* a); // c=a<<b, return carrier
+uint32_t multiprecision_lshift(uint32_t* c,
+ uint32_t* a); // c=a<<b, return carrier
+void multiprecision_mult(uint32_t* c, uint32_t* a, uint32_t* b); // c=a*b
+void multiprecision_mersenns_mult_mod(uint32_t* c, uint32_t* a, uint32_t* b);
+void multiprecision_mersenns_squa_mod(uint32_t* c, uint32_t* a);
+uint32_t multiprecision_lshift(uint32_t* c, uint32_t* a);
+void multiprecision_mult(uint32_t* c, uint32_t* a, uint32_t* b);
void multiprecision_fast_mod(uint32_t* c, uint32_t* a);
void multiprecision_fast_mod_P256(uint32_t* c, uint32_t* a);
diff --git a/system/stack/smp/smp_api.cc b/system/stack/smp/smp_api.cc
index baa41cf..e082356 100644
--- a/system/stack/smp/smp_api.cc
+++ b/system/stack/smp/smp_api.cc
@@ -62,7 +62,7 @@
smp_l2cap_if_init();
/* initialization of P-256 parameters */
- p_256_init_curve(KEY_LENGTH_DWORDS_P256);
+ p_256_init_curve();
/* Initialize failure case for certification */
smp_cb.cert_failure =
diff --git a/system/stack/smp/smp_keys.cc b/system/stack/smp/smp_keys.cc
index da8d0f4..64c969d 100644
--- a/system/stack/smp/smp_keys.cc
+++ b/system/stack/smp/smp_keys.cc
@@ -691,8 +691,7 @@
SMP_TRACE_DEBUG("%s", __func__);
memcpy(private_key, p_cb->private_key, BT_OCTET32_LEN);
- ECC_PointMult(&public_key, &(curve_p256.G), (uint32_t*)private_key,
- KEY_LENGTH_DWORDS_P256);
+ ECC_PointMult(&public_key, &(curve_p256.G), (uint32_t*)private_key);
memcpy(p_cb->loc_publ_key.x, public_key.x, BT_OCTET32_LEN);
memcpy(p_cb->loc_publ_key.y, public_key.y, BT_OCTET32_LEN);
@@ -728,8 +727,7 @@
memcpy(peer_publ_key.x, p_cb->peer_publ_key.x, BT_OCTET32_LEN);
memcpy(peer_publ_key.y, p_cb->peer_publ_key.y, BT_OCTET32_LEN);
- ECC_PointMult(&new_publ_key, &peer_publ_key, (uint32_t*)private_key,
- KEY_LENGTH_DWORDS_P256);
+ ECC_PointMult(&new_publ_key, &peer_publ_key, (uint32_t*)private_key);
memcpy(p_cb->dhkey, new_publ_key.x, BT_OCTET32_LEN);
diff --git a/system/stack/test/stack_smp_test.cc b/system/stack/test/stack_smp_test.cc
index 1bb51ea..d83430c 100644
--- a/system/stack/test/stack_smp_test.cc
+++ b/system/stack/test/stack_smp_test.cc
@@ -261,8 +261,8 @@
TEST(SmpEccValidationTest, test_invalid_points) {
Point p;
- multiprecision_init(p.x, 8);
- multiprecision_init(p.y, 8);
+ multiprecision_init(p.x);
+ multiprecision_init(p.y);
EXPECT_FALSE(ECC_ValidatePoint(p));