summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ec/ecp_nistputil.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/ec/ecp_nistputil.c100
1 files changed, 56 insertions, 44 deletions
diff --git a/src/lib/libcrypto/ec/ecp_nistputil.c b/src/lib/libcrypto/ec/ecp_nistputil.c
index c8140c807f..0312fb16ad 100644
--- a/src/lib/libcrypto/ec/ecp_nistputil.c
+++ b/src/lib/libcrypto/ec/ecp_nistputil.c
@@ -41,16 +41,17 @@
41 * tmp_felems needs to point to a temporary array of 'num'+1 field elements 41 * tmp_felems needs to point to a temporary array of 'num'+1 field elements
42 * for storage of intermediate values. 42 * for storage of intermediate values.
43 */ 43 */
44void ec_GFp_nistp_points_make_affine_internal(size_t num, void *point_array, 44void
45 size_t felem_size, void *tmp_felems, 45ec_GFp_nistp_points_make_affine_internal(size_t num, void *point_array,
46 void (*felem_one)(void *out), 46 size_t felem_size, void *tmp_felems,
47 int (*felem_is_zero)(const void *in), 47 void (*felem_one) (void *out),
48 void (*felem_assign)(void *out, const void *in), 48 int (*felem_is_zero) (const void *in),
49 void (*felem_square)(void *out, const void *in), 49 void (*felem_assign) (void *out, const void *in),
50 void (*felem_mul)(void *out, const void *in1, const void *in2), 50 void (*felem_square) (void *out, const void *in),
51 void (*felem_inv)(void *out, const void *in), 51 void (*felem_mul) (void *out, const void *in1, const void *in2),
52 void (*felem_contract)(void *out, const void *in)) 52 void (*felem_inv) (void *out, const void *in),
53 { 53 void (*felem_contract) (void *out, const void *in))
54{
54 int i = 0; 55 int i = 0;
55 56
56#define tmp_felem(I) (&((char *)tmp_felems)[(I) * felem_size]) 57#define tmp_felem(I) (&((char *)tmp_felems)[(I) * felem_size])
@@ -62,50 +63,59 @@ void ec_GFp_nistp_points_make_affine_internal(size_t num, void *point_array,
62 felem_assign(tmp_felem(0), Z(0)); 63 felem_assign(tmp_felem(0), Z(0));
63 else 64 else
64 felem_one(tmp_felem(0)); 65 felem_one(tmp_felem(0));
65 for (i = 1; i < (int)num; i++) 66 for (i = 1; i < (int) num; i++) {
66 {
67 if (!felem_is_zero(Z(i))) 67 if (!felem_is_zero(Z(i)))
68 felem_mul(tmp_felem(i), tmp_felem(i-1), Z(i)); 68 felem_mul(tmp_felem(i), tmp_felem(i - 1), Z(i));
69 else 69 else
70 felem_assign(tmp_felem(i), tmp_felem(i-1)); 70 felem_assign(tmp_felem(i), tmp_felem(i - 1));
71 } 71 }
72 /* Now each tmp_felem(i) is the product of Z(0) .. Z(i), skipping any zero-valued factors: 72 /*
73 * if Z(i) = 0, we essentially pretend that Z(i) = 1 */ 73 * Now each tmp_felem(i) is the product of Z(0) .. Z(i), skipping any
74 * zero-valued factors: if Z(i) = 0, we essentially pretend that Z(i)
75 * = 1
76 */
74 77
75 felem_inv(tmp_felem(num-1), tmp_felem(num-1)); 78 felem_inv(tmp_felem(num - 1), tmp_felem(num - 1));
76 for (i = num - 1; i >= 0; i--) 79 for (i = num - 1; i >= 0; i--) {
77 {
78 if (i > 0) 80 if (i > 0)
79 /* tmp_felem(i-1) is the product of Z(0) .. Z(i-1), 81 /*
80 * tmp_felem(i) is the inverse of the product of Z(0) .. Z(i) 82 * tmp_felem(i-1) is the product of Z(0) .. Z(i-1),
83 * tmp_felem(i) is the inverse of the product of Z(0)
84 * .. Z(i)
81 */ 85 */
82 felem_mul(tmp_felem(num), tmp_felem(i-1), tmp_felem(i)); /* 1/Z(i) */ 86 felem_mul(tmp_felem(num), tmp_felem(i - 1), tmp_felem(i)); /* 1/Z(i) */
83 else 87 else
84 felem_assign(tmp_felem(num), tmp_felem(0)); /* 1/Z(0) */ 88 felem_assign(tmp_felem(num), tmp_felem(0)); /* 1/Z(0) */
85 89
86 if (!felem_is_zero(Z(i))) 90 if (!felem_is_zero(Z(i))) {
87 {
88 if (i > 0) 91 if (i > 0)
89 /* For next iteration, replace tmp_felem(i-1) by its inverse */ 92 /*
90 felem_mul(tmp_felem(i-1), tmp_felem(i), Z(i)); 93 * For next iteration, replace tmp_felem(i-1)
94 * by its inverse
95 */
96 felem_mul(tmp_felem(i - 1), tmp_felem(i), Z(i));
91 97
92 /* Convert point (X, Y, Z) into affine form (X/(Z^2), Y/(Z^3), 1) */ 98 /*
93 felem_square(Z(i), tmp_felem(num)); /* 1/(Z^2) */ 99 * Convert point (X, Y, Z) into affine form (X/(Z^2),
94 felem_mul(X(i), X(i), Z(i)); /* X/(Z^2) */ 100 * Y/(Z^3), 1)
95 felem_mul(Z(i), Z(i), tmp_felem(num)); /* 1/(Z^3) */ 101 */
96 felem_mul(Y(i), Y(i), Z(i)); /* Y/(Z^3) */ 102 felem_square(Z(i), tmp_felem(num)); /* 1/(Z^2) */
103 felem_mul(X(i), X(i), Z(i)); /* X/(Z^2) */
104 felem_mul(Z(i), Z(i), tmp_felem(num)); /* 1/(Z^3) */
105 felem_mul(Y(i), Y(i), Z(i)); /* Y/(Z^3) */
97 felem_contract(X(i), X(i)); 106 felem_contract(X(i), X(i));
98 felem_contract(Y(i), Y(i)); 107 felem_contract(Y(i), Y(i));
99 felem_one(Z(i)); 108 felem_one(Z(i));
100 } 109 } else {
101 else
102 {
103 if (i > 0) 110 if (i > 0)
104 /* For next iteration, replace tmp_felem(i-1) by its inverse */ 111 /*
105 felem_assign(tmp_felem(i-1), tmp_felem(i)); 112 * For next iteration, replace tmp_felem(i-1)
106 } 113 * by its inverse
114 */
115 felem_assign(tmp_felem(i - 1), tmp_felem(i));
107 } 116 }
108 } 117 }
118}
109 119
110/* 120/*
111 * This function looks at 5+1 scalar bits (5 current, 1 adjacent less 121 * This function looks at 5+1 scalar bits (5 current, 1 adjacent less
@@ -180,18 +190,20 @@ void ec_GFp_nistp_points_make_affine_internal(size_t num, void *point_array,
180 * has to be b_4 b_3 b_2 b_1 b_0 0. 190 * has to be b_4 b_3 b_2 b_1 b_0 0.
181 * 191 *
182 */ 192 */
183void ec_GFp_nistp_recode_scalar_bits(unsigned char *sign, unsigned char *digit, unsigned char in) 193void
184 { 194ec_GFp_nistp_recode_scalar_bits(unsigned char *sign, unsigned char *digit, unsigned char in)
195{
185 unsigned char s, d; 196 unsigned char s, d;
186 197
187 s = ~((in >> 5) - 1); /* sets all bits to MSB(in), 'in' seen as 6-bit value */ 198 s = ~((in >> 5) - 1); /* sets all bits to MSB(in), 'in' seen as
199 * 6-bit value */
188 d = (1 << 6) - in - 1; 200 d = (1 << 6) - in - 1;
189 d = (d & s) | (in & ~s); 201 d = (d & s) | (in & ~s);
190 d = (d >> 1) + (d & 1); 202 d = (d >> 1) + (d & 1);
191 203
192 *sign = s & 1; 204 *sign = s & 1;
193 *digit = d; 205 *digit = d;
194 } 206}
195#else 207#else
196static void *dummy=&dummy; 208static void *dummy = &dummy;
197#endif 209#endif