diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib/libcrypto/ec/ecp_nistputil.c | 100 |
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 | */ |
44 | void ec_GFp_nistp_points_make_affine_internal(size_t num, void *point_array, | 44 | void |
45 | size_t felem_size, void *tmp_felems, | 45 | ec_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 | */ |
183 | void ec_GFp_nistp_recode_scalar_bits(unsigned char *sign, unsigned char *digit, unsigned char in) | 193 | void |
184 | { | 194 | ec_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 |
196 | static void *dummy=&dummy; | 208 | static void *dummy = &dummy; |
197 | #endif | 209 | #endif |