| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/ec/ec2_smpl.c |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | /* | - | ||||||||||||||||||
| 2 | * Copyright 2002-2018 The OpenSSL Project Authors. All Rights Reserved. | - | ||||||||||||||||||
| 3 | * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved | - | ||||||||||||||||||
| 4 | * | - | ||||||||||||||||||
| 5 | * Licensed under the OpenSSL license (the "License"). You may not use | - | ||||||||||||||||||
| 6 | * this file except in compliance with the License. You can obtain a copy | - | ||||||||||||||||||
| 7 | * in the file LICENSE in the source distribution or at | - | ||||||||||||||||||
| 8 | * https://www.openssl.org/source/license.html | - | ||||||||||||||||||
| 9 | */ | - | ||||||||||||||||||
| 10 | - | |||||||||||||||||||
| 11 | #include <openssl/err.h> | - | ||||||||||||||||||
| 12 | - | |||||||||||||||||||
| 13 | #include "internal/bn_int.h" | - | ||||||||||||||||||
| 14 | #include "ec_lcl.h" | - | ||||||||||||||||||
| 15 | - | |||||||||||||||||||
| 16 | #ifndef OPENSSL_NO_EC2M | - | ||||||||||||||||||
| 17 | - | |||||||||||||||||||
| 18 | /* | - | ||||||||||||||||||
| 19 | * Initialize a GF(2^m)-based EC_GROUP structure. Note that all other members | - | ||||||||||||||||||
| 20 | * are handled by EC_GROUP_new. | - | ||||||||||||||||||
| 21 | */ | - | ||||||||||||||||||
| 22 | int ec_GF2m_simple_group_init(EC_GROUP *group) | - | ||||||||||||||||||
| 23 | { | - | ||||||||||||||||||
| 24 | group->field = BN_new(); | - | ||||||||||||||||||
| 25 | group->a = BN_new(); | - | ||||||||||||||||||
| 26 | group->b = BN_new(); | - | ||||||||||||||||||
| 27 | - | |||||||||||||||||||
| 28 | if (group->field == NULL || group->a == NULL || group->b == NULL) {
| 0-19489 | ||||||||||||||||||
| 29 | BN_free(group->field); | - | ||||||||||||||||||
| 30 | BN_free(group->a); | - | ||||||||||||||||||
| 31 | BN_free(group->b); | - | ||||||||||||||||||
| 32 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 33 | } | - | ||||||||||||||||||
| 34 | return 1; executed 19489 times by 1 test: return 1;Executed by:
| 19489 | ||||||||||||||||||
| 35 | } | - | ||||||||||||||||||
| 36 | - | |||||||||||||||||||
| 37 | /* | - | ||||||||||||||||||
| 38 | * Free a GF(2^m)-based EC_GROUP structure. Note that all other members are | - | ||||||||||||||||||
| 39 | * handled by EC_GROUP_free. | - | ||||||||||||||||||
| 40 | */ | - | ||||||||||||||||||
| 41 | void ec_GF2m_simple_group_finish(EC_GROUP *group) | - | ||||||||||||||||||
| 42 | { | - | ||||||||||||||||||
| 43 | BN_free(group->field); | - | ||||||||||||||||||
| 44 | BN_free(group->a); | - | ||||||||||||||||||
| 45 | BN_free(group->b); | - | ||||||||||||||||||
| 46 | } executed 19488 times by 1 test: end of blockExecuted by:
| 19488 | ||||||||||||||||||
| 47 | - | |||||||||||||||||||
| 48 | /* | - | ||||||||||||||||||
| 49 | * Clear and free a GF(2^m)-based EC_GROUP structure. Note that all other | - | ||||||||||||||||||
| 50 | * members are handled by EC_GROUP_clear_free. | - | ||||||||||||||||||
| 51 | */ | - | ||||||||||||||||||
| 52 | void ec_GF2m_simple_group_clear_finish(EC_GROUP *group) | - | ||||||||||||||||||
| 53 | { | - | ||||||||||||||||||
| 54 | BN_clear_free(group->field); | - | ||||||||||||||||||
| 55 | BN_clear_free(group->a); | - | ||||||||||||||||||
| 56 | BN_clear_free(group->b); | - | ||||||||||||||||||
| 57 | group->poly[0] = 0; | - | ||||||||||||||||||
| 58 | group->poly[1] = 0; | - | ||||||||||||||||||
| 59 | group->poly[2] = 0; | - | ||||||||||||||||||
| 60 | group->poly[3] = 0; | - | ||||||||||||||||||
| 61 | group->poly[4] = 0; | - | ||||||||||||||||||
| 62 | group->poly[5] = -1; | - | ||||||||||||||||||
| 63 | } executed 1 time by 1 test: end of blockExecuted by:
| 1 | ||||||||||||||||||
| 64 | - | |||||||||||||||||||
| 65 | /* | - | ||||||||||||||||||
| 66 | * Copy a GF(2^m)-based EC_GROUP structure. Note that all other members are | - | ||||||||||||||||||
| 67 | * handled by EC_GROUP_copy. | - | ||||||||||||||||||
| 68 | */ | - | ||||||||||||||||||
| 69 | int ec_GF2m_simple_group_copy(EC_GROUP *dest, const EC_GROUP *src) | - | ||||||||||||||||||
| 70 | { | - | ||||||||||||||||||
| 71 | if (!BN_copy(dest->field, src->field))
| 0-9858 | ||||||||||||||||||
| 72 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 73 | if (!BN_copy(dest->a, src->a))
| 0-9858 | ||||||||||||||||||
| 74 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 75 | if (!BN_copy(dest->b, src->b))
| 0-9858 | ||||||||||||||||||
| 76 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 77 | dest->poly[0] = src->poly[0]; | - | ||||||||||||||||||
| 78 | dest->poly[1] = src->poly[1]; | - | ||||||||||||||||||
| 79 | dest->poly[2] = src->poly[2]; | - | ||||||||||||||||||
| 80 | dest->poly[3] = src->poly[3]; | - | ||||||||||||||||||
| 81 | dest->poly[4] = src->poly[4]; | - | ||||||||||||||||||
| 82 | dest->poly[5] = src->poly[5]; | - | ||||||||||||||||||
| 83 | if (bn_wexpand(dest->a, (int)(dest->poly[0] + BN_BITS2 - 1) / BN_BITS2) ==
| 0-9858 | ||||||||||||||||||
| 84 | NULL)
| 0-9858 | ||||||||||||||||||
| 85 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 86 | if (bn_wexpand(dest->b, (int)(dest->poly[0] + BN_BITS2 - 1) / BN_BITS2) ==
| 0-9858 | ||||||||||||||||||
| 87 | NULL)
| 0-9858 | ||||||||||||||||||
| 88 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 89 | bn_set_all_zero(dest->a); | - | ||||||||||||||||||
| 90 | bn_set_all_zero(dest->b); | - | ||||||||||||||||||
| 91 | return 1; executed 9858 times by 1 test: return 1;Executed by:
| 9858 | ||||||||||||||||||
| 92 | } | - | ||||||||||||||||||
| 93 | - | |||||||||||||||||||
| 94 | /* Set the curve parameters of an EC_GROUP structure. */ | - | ||||||||||||||||||
| 95 | int ec_GF2m_simple_group_set_curve(EC_GROUP *group, | - | ||||||||||||||||||
| 96 | const BIGNUM *p, const BIGNUM *a, | - | ||||||||||||||||||
| 97 | const BIGNUM *b, BN_CTX *ctx) | - | ||||||||||||||||||
| 98 | { | - | ||||||||||||||||||
| 99 | int ret = 0, i; | - | ||||||||||||||||||
| 100 | - | |||||||||||||||||||
| 101 | /* group->field */ | - | ||||||||||||||||||
| 102 | if (!BN_copy(group->field, p))
| 0-9631 | ||||||||||||||||||
| 103 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 104 | i = BN_GF2m_poly2arr(group->field, group->poly, 6) - 1; | - | ||||||||||||||||||
| 105 | if ((i != 5) && (i != 3)) {
| 0-5435 | ||||||||||||||||||
| 106 | ECerr(EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE, EC_R_UNSUPPORTED_FIELD); | - | ||||||||||||||||||
| 107 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 108 | } | - | ||||||||||||||||||
| 109 | - | |||||||||||||||||||
| 110 | /* group->a */ | - | ||||||||||||||||||
| 111 | if (!BN_GF2m_mod_arr(group->a, a, group->poly))
| 0-9631 | ||||||||||||||||||
| 112 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 113 | if (bn_wexpand(group->a, (int)(group->poly[0] + BN_BITS2 - 1) / BN_BITS2)
| 0-9631 | ||||||||||||||||||
| 114 | == NULL)
| 0-9631 | ||||||||||||||||||
| 115 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 116 | bn_set_all_zero(group->a); | - | ||||||||||||||||||
| 117 | - | |||||||||||||||||||
| 118 | /* group->b */ | - | ||||||||||||||||||
| 119 | if (!BN_GF2m_mod_arr(group->b, b, group->poly))
| 0-9631 | ||||||||||||||||||
| 120 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 121 | if (bn_wexpand(group->b, (int)(group->poly[0] + BN_BITS2 - 1) / BN_BITS2)
| 0-9631 | ||||||||||||||||||
| 122 | == NULL)
| 0-9631 | ||||||||||||||||||
| 123 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 124 | bn_set_all_zero(group->b); | - | ||||||||||||||||||
| 125 | - | |||||||||||||||||||
| 126 | ret = 1; | - | ||||||||||||||||||
| 127 | err: code before this statement executed 9631 times by 1 test: err:Executed by:
| 9631 | ||||||||||||||||||
| 128 | return ret; executed 9631 times by 1 test: return ret;Executed by:
| 9631 | ||||||||||||||||||
| 129 | } | - | ||||||||||||||||||
| 130 | - | |||||||||||||||||||
| 131 | /* | - | ||||||||||||||||||
| 132 | * Get the curve parameters of an EC_GROUP structure. If p, a, or b are NULL | - | ||||||||||||||||||
| 133 | * then there values will not be set but the method will return with success. | - | ||||||||||||||||||
| 134 | */ | - | ||||||||||||||||||
| 135 | int ec_GF2m_simple_group_get_curve(const EC_GROUP *group, BIGNUM *p, | - | ||||||||||||||||||
| 136 | BIGNUM *a, BIGNUM *b, BN_CTX *ctx) | - | ||||||||||||||||||
| 137 | { | - | ||||||||||||||||||
| 138 | int ret = 0; | - | ||||||||||||||||||
| 139 | - | |||||||||||||||||||
| 140 | if (p != NULL) {
| 0-2025 | ||||||||||||||||||
| 141 | if (!BN_copy(p, group->field))
| 0-2025 | ||||||||||||||||||
| 142 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 143 | } executed 2025 times by 1 test: end of blockExecuted by:
| 2025 | ||||||||||||||||||
| 144 | - | |||||||||||||||||||
| 145 | if (a != NULL) {
| 0-2025 | ||||||||||||||||||
| 146 | if (!BN_copy(a, group->a))
| 0-2025 | ||||||||||||||||||
| 147 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 148 | } executed 2025 times by 1 test: end of blockExecuted by:
| 2025 | ||||||||||||||||||
| 149 | - | |||||||||||||||||||
| 150 | if (b != NULL) {
| 0-2025 | ||||||||||||||||||
| 151 | if (!BN_copy(b, group->b))
| 0-2025 | ||||||||||||||||||
| 152 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 153 | } executed 2025 times by 1 test: end of blockExecuted by:
| 2025 | ||||||||||||||||||
| 154 | - | |||||||||||||||||||
| 155 | ret = 1; | - | ||||||||||||||||||
| 156 | - | |||||||||||||||||||
| 157 | err: code before this statement executed 2025 times by 1 test: err:Executed by:
| 2025 | ||||||||||||||||||
| 158 | return ret; executed 2025 times by 1 test: return ret;Executed by:
| 2025 | ||||||||||||||||||
| 159 | } | - | ||||||||||||||||||
| 160 | - | |||||||||||||||||||
| 161 | /* | - | ||||||||||||||||||
| 162 | * Gets the degree of the field. For a curve over GF(2^m) this is the value | - | ||||||||||||||||||
| 163 | * m. | - | ||||||||||||||||||
| 164 | */ | - | ||||||||||||||||||
| 165 | int ec_GF2m_simple_group_get_degree(const EC_GROUP *group) | - | ||||||||||||||||||
| 166 | { | - | ||||||||||||||||||
| 167 | return BN_num_bits(group->field) - 1; executed 9626 times by 1 test: return BN_num_bits(group->field) - 1;Executed by:
| 9626 | ||||||||||||||||||
| 168 | } | - | ||||||||||||||||||
| 169 | - | |||||||||||||||||||
| 170 | /* | - | ||||||||||||||||||
| 171 | * Checks the discriminant of the curve. y^2 + x*y = x^3 + a*x^2 + b is an | - | ||||||||||||||||||
| 172 | * elliptic curve <=> b != 0 (mod p) | - | ||||||||||||||||||
| 173 | */ | - | ||||||||||||||||||
| 174 | int ec_GF2m_simple_group_check_discriminant(const EC_GROUP *group, | - | ||||||||||||||||||
| 175 | BN_CTX *ctx) | - | ||||||||||||||||||
| 176 | { | - | ||||||||||||||||||
| 177 | int ret = 0; | - | ||||||||||||||||||
| 178 | BIGNUM *b; | - | ||||||||||||||||||
| 179 | BN_CTX *new_ctx = NULL; | - | ||||||||||||||||||
| 180 | - | |||||||||||||||||||
| 181 | if (ctx == NULL) {
| 0-122 | ||||||||||||||||||
| 182 | ctx = new_ctx = BN_CTX_new(); | - | ||||||||||||||||||
| 183 | if (ctx == NULL) {
| 0 | ||||||||||||||||||
| 184 | ECerr(EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT, | - | ||||||||||||||||||
| 185 | ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||
| 186 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 187 | } | - | ||||||||||||||||||
| 188 | } never executed: end of block | 0 | ||||||||||||||||||
| 189 | BN_CTX_start(ctx); | - | ||||||||||||||||||
| 190 | b = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 191 | if (b == NULL)
| 0-122 | ||||||||||||||||||
| 192 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 193 | - | |||||||||||||||||||
| 194 | if (!BN_GF2m_mod_arr(b, group->b, group->poly))
| 0-122 | ||||||||||||||||||
| 195 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 196 | - | |||||||||||||||||||
| 197 | /* | - | ||||||||||||||||||
| 198 | * check the discriminant: y^2 + x*y = x^3 + a*x^2 + b is an elliptic | - | ||||||||||||||||||
| 199 | * curve <=> b != 0 (mod p) | - | ||||||||||||||||||
| 200 | */ | - | ||||||||||||||||||
| 201 | if (BN_is_zero(b))
| 0-122 | ||||||||||||||||||
| 202 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 203 | - | |||||||||||||||||||
| 204 | ret = 1; | - | ||||||||||||||||||
| 205 | - | |||||||||||||||||||
| 206 | err: code before this statement executed 122 times by 1 test: err:Executed by:
| 122 | ||||||||||||||||||
| 207 | if (ctx != NULL)
| 0-122 | ||||||||||||||||||
| 208 | BN_CTX_end(ctx); executed 122 times by 1 test: BN_CTX_end(ctx);Executed by:
| 122 | ||||||||||||||||||
| 209 | BN_CTX_free(new_ctx); | - | ||||||||||||||||||
| 210 | return ret; executed 122 times by 1 test: return ret;Executed by:
| 122 | ||||||||||||||||||
| 211 | } | - | ||||||||||||||||||
| 212 | - | |||||||||||||||||||
| 213 | /* Initializes an EC_POINT. */ | - | ||||||||||||||||||
| 214 | int ec_GF2m_simple_point_init(EC_POINT *point) | - | ||||||||||||||||||
| 215 | { | - | ||||||||||||||||||
| 216 | point->X = BN_new(); | - | ||||||||||||||||||
| 217 | point->Y = BN_new(); | - | ||||||||||||||||||
| 218 | point->Z = BN_new(); | - | ||||||||||||||||||
| 219 | - | |||||||||||||||||||
| 220 | if (point->X == NULL || point->Y == NULL || point->Z == NULL) {
| 0-49398 | ||||||||||||||||||
| 221 | BN_free(point->X); | - | ||||||||||||||||||
| 222 | BN_free(point->Y); | - | ||||||||||||||||||
| 223 | BN_free(point->Z); | - | ||||||||||||||||||
| 224 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 225 | } | - | ||||||||||||||||||
| 226 | return 1; executed 49398 times by 1 test: return 1;Executed by:
| 49398 | ||||||||||||||||||
| 227 | } | - | ||||||||||||||||||
| 228 | - | |||||||||||||||||||
| 229 | /* Frees an EC_POINT. */ | - | ||||||||||||||||||
| 230 | void ec_GF2m_simple_point_finish(EC_POINT *point) | - | ||||||||||||||||||
| 231 | { | - | ||||||||||||||||||
| 232 | BN_free(point->X); | - | ||||||||||||||||||
| 233 | BN_free(point->Y); | - | ||||||||||||||||||
| 234 | BN_free(point->Z); | - | ||||||||||||||||||
| 235 | } executed 44814 times by 1 test: end of blockExecuted by:
| 44814 | ||||||||||||||||||
| 236 | - | |||||||||||||||||||
| 237 | /* Clears and frees an EC_POINT. */ | - | ||||||||||||||||||
| 238 | void ec_GF2m_simple_point_clear_finish(EC_POINT *point) | - | ||||||||||||||||||
| 239 | { | - | ||||||||||||||||||
| 240 | BN_clear_free(point->X); | - | ||||||||||||||||||
| 241 | BN_clear_free(point->Y); | - | ||||||||||||||||||
| 242 | BN_clear_free(point->Z); | - | ||||||||||||||||||
| 243 | point->Z_is_one = 0; | - | ||||||||||||||||||
| 244 | } executed 4584 times by 1 test: end of blockExecuted by:
| 4584 | ||||||||||||||||||
| 245 | - | |||||||||||||||||||
| 246 | /* | - | ||||||||||||||||||
| 247 | * Copy the contents of one EC_POINT into another. Assumes dest is | - | ||||||||||||||||||
| 248 | * initialized. | - | ||||||||||||||||||
| 249 | */ | - | ||||||||||||||||||
| 250 | int ec_GF2m_simple_point_copy(EC_POINT *dest, const EC_POINT *src) | - | ||||||||||||||||||
| 251 | { | - | ||||||||||||||||||
| 252 | if (!BN_copy(dest->X, src->X))
| 0-26238 | ||||||||||||||||||
| 253 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 254 | if (!BN_copy(dest->Y, src->Y))
| 0-26238 | ||||||||||||||||||
| 255 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 256 | if (!BN_copy(dest->Z, src->Z))
| 0-26238 | ||||||||||||||||||
| 257 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 258 | dest->Z_is_one = src->Z_is_one; | - | ||||||||||||||||||
| 259 | dest->curve_name = src->curve_name; | - | ||||||||||||||||||
| 260 | - | |||||||||||||||||||
| 261 | return 1; executed 26238 times by 1 test: return 1;Executed by:
| 26238 | ||||||||||||||||||
| 262 | } | - | ||||||||||||||||||
| 263 | - | |||||||||||||||||||
| 264 | /* | - | ||||||||||||||||||
| 265 | * Set an EC_POINT to the point at infinity. A point at infinity is | - | ||||||||||||||||||
| 266 | * represented by having Z=0. | - | ||||||||||||||||||
| 267 | */ | - | ||||||||||||||||||
| 268 | int ec_GF2m_simple_point_set_to_infinity(const EC_GROUP *group, | - | ||||||||||||||||||
| 269 | EC_POINT *point) | - | ||||||||||||||||||
| 270 | { | - | ||||||||||||||||||
| 271 | point->Z_is_one = 0; | - | ||||||||||||||||||
| 272 | BN_zero(point->Z); | - | ||||||||||||||||||
| 273 | return 1; executed 831 times by 1 test: return 1;Executed by:
| 831 | ||||||||||||||||||
| 274 | } | - | ||||||||||||||||||
| 275 | - | |||||||||||||||||||
| 276 | /* | - | ||||||||||||||||||
| 277 | * Set the coordinates of an EC_POINT using affine coordinates. Note that | - | ||||||||||||||||||
| 278 | * the simple implementation only uses affine coordinates. | - | ||||||||||||||||||
| 279 | */ | - | ||||||||||||||||||
| 280 | int ec_GF2m_simple_point_set_affine_coordinates(const EC_GROUP *group, | - | ||||||||||||||||||
| 281 | EC_POINT *point, | - | ||||||||||||||||||
| 282 | const BIGNUM *x, | - | ||||||||||||||||||
| 283 | const BIGNUM *y, BN_CTX *ctx) | - | ||||||||||||||||||
| 284 | { | - | ||||||||||||||||||
| 285 | int ret = 0; | - | ||||||||||||||||||
| 286 | if (x == NULL || y == NULL) {
| 0-80606 | ||||||||||||||||||
| 287 | ECerr(EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES, | - | ||||||||||||||||||
| 288 | ERR_R_PASSED_NULL_PARAMETER); | - | ||||||||||||||||||
| 289 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 290 | } | - | ||||||||||||||||||
| 291 | - | |||||||||||||||||||
| 292 | if (!BN_copy(point->X, x))
| 0-80606 | ||||||||||||||||||
| 293 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 294 | BN_set_negative(point->X, 0); | - | ||||||||||||||||||
| 295 | if (!BN_copy(point->Y, y))
| 0-80606 | ||||||||||||||||||
| 296 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 297 | BN_set_negative(point->Y, 0); | - | ||||||||||||||||||
| 298 | if (!BN_copy(point->Z, BN_value_one()))
| 0-80606 | ||||||||||||||||||
| 299 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 300 | BN_set_negative(point->Z, 0); | - | ||||||||||||||||||
| 301 | point->Z_is_one = 1; | - | ||||||||||||||||||
| 302 | ret = 1; | - | ||||||||||||||||||
| 303 | - | |||||||||||||||||||
| 304 | err: code before this statement executed 80606 times by 1 test: err:Executed by:
| 80606 | ||||||||||||||||||
| 305 | return ret; executed 80606 times by 1 test: return ret;Executed by:
| 80606 | ||||||||||||||||||
| 306 | } | - | ||||||||||||||||||
| 307 | - | |||||||||||||||||||
| 308 | /* | - | ||||||||||||||||||
| 309 | * Gets the affine coordinates of an EC_POINT. Note that the simple | - | ||||||||||||||||||
| 310 | * implementation only uses affine coordinates. | - | ||||||||||||||||||
| 311 | */ | - | ||||||||||||||||||
| 312 | int ec_GF2m_simple_point_get_affine_coordinates(const EC_GROUP *group, | - | ||||||||||||||||||
| 313 | const EC_POINT *point, | - | ||||||||||||||||||
| 314 | BIGNUM *x, BIGNUM *y, | - | ||||||||||||||||||
| 315 | BN_CTX *ctx) | - | ||||||||||||||||||
| 316 | { | - | ||||||||||||||||||
| 317 | int ret = 0; | - | ||||||||||||||||||
| 318 | - | |||||||||||||||||||
| 319 | if (EC_POINT_is_at_infinity(group, point)) {
| 0-826 | ||||||||||||||||||
| 320 | ECerr(EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES, | - | ||||||||||||||||||
| 321 | EC_R_POINT_AT_INFINITY); | - | ||||||||||||||||||
| 322 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 323 | } | - | ||||||||||||||||||
| 324 | - | |||||||||||||||||||
| 325 | if (BN_cmp(point->Z, BN_value_one())) {
| 0-826 | ||||||||||||||||||
| 326 | ECerr(EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES, | - | ||||||||||||||||||
| 327 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | - | ||||||||||||||||||
| 328 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 329 | } | - | ||||||||||||||||||
| 330 | if (x != NULL) {
| 0-826 | ||||||||||||||||||
| 331 | if (!BN_copy(x, point->X))
| 0-826 | ||||||||||||||||||
| 332 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 333 | BN_set_negative(x, 0); | - | ||||||||||||||||||
| 334 | } executed 826 times by 1 test: end of blockExecuted by:
| 826 | ||||||||||||||||||
| 335 | if (y != NULL) {
| 100-726 | ||||||||||||||||||
| 336 | if (!BN_copy(y, point->Y))
| 0-100 | ||||||||||||||||||
| 337 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 338 | BN_set_negative(y, 0); | - | ||||||||||||||||||
| 339 | } executed 100 times by 1 test: end of blockExecuted by:
| 100 | ||||||||||||||||||
| 340 | ret = 1; | - | ||||||||||||||||||
| 341 | - | |||||||||||||||||||
| 342 | err: code before this statement executed 826 times by 1 test: err:Executed by:
| 826 | ||||||||||||||||||
| 343 | return ret; executed 826 times by 1 test: return ret;Executed by:
| 826 | ||||||||||||||||||
| 344 | } | - | ||||||||||||||||||
| 345 | - | |||||||||||||||||||
| 346 | /* | - | ||||||||||||||||||
| 347 | * Computes a + b and stores the result in r. r could be a or b, a could be | - | ||||||||||||||||||
| 348 | * b. Uses algorithm A.10.2 of IEEE P1363. | - | ||||||||||||||||||
| 349 | */ | - | ||||||||||||||||||
| 350 | int ec_GF2m_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, | - | ||||||||||||||||||
| 351 | const EC_POINT *b, BN_CTX *ctx) | - | ||||||||||||||||||
| 352 | { | - | ||||||||||||||||||
| 353 | BN_CTX *new_ctx = NULL; | - | ||||||||||||||||||
| 354 | BIGNUM *x0, *y0, *x1, *y1, *x2, *y2, *s, *t; | - | ||||||||||||||||||
| 355 | int ret = 0; | - | ||||||||||||||||||
| 356 | - | |||||||||||||||||||
| 357 | if (EC_POINT_is_at_infinity(group, a)) {
| 3765-85790 | ||||||||||||||||||
| 358 | if (!EC_POINT_copy(r, b))
| 0-3765 | ||||||||||||||||||
| 359 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 360 | return 1; executed 3765 times by 1 test: return 1;Executed by:
| 3765 | ||||||||||||||||||
| 361 | } | - | ||||||||||||||||||
| 362 | - | |||||||||||||||||||
| 363 | if (EC_POINT_is_at_infinity(group, b)) {
| 19856-65934 | ||||||||||||||||||
| 364 | if (!EC_POINT_copy(r, a))
| 0-19856 | ||||||||||||||||||
| 365 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 366 | return 1; executed 19856 times by 1 test: return 1;Executed by:
| 19856 | ||||||||||||||||||
| 367 | } | - | ||||||||||||||||||
| 368 | - | |||||||||||||||||||
| 369 | if (ctx == NULL) {
| 0-65934 | ||||||||||||||||||
| 370 | ctx = new_ctx = BN_CTX_new(); | - | ||||||||||||||||||
| 371 | if (ctx == NULL)
| 0 | ||||||||||||||||||
| 372 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 373 | } never executed: end of block | 0 | ||||||||||||||||||
| 374 | - | |||||||||||||||||||
| 375 | BN_CTX_start(ctx); | - | ||||||||||||||||||
| 376 | x0 = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 377 | y0 = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 378 | x1 = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 379 | y1 = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 380 | x2 = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 381 | y2 = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 382 | s = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 383 | t = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 384 | if (t == NULL)
| 0-65934 | ||||||||||||||||||
| 385 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 386 | - | |||||||||||||||||||
| 387 | if (a->Z_is_one) {
| 0-65934 | ||||||||||||||||||
| 388 | if (!BN_copy(x0, a->X))
| 0-65934 | ||||||||||||||||||
| 389 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 390 | if (!BN_copy(y0, a->Y))
| 0-65934 | ||||||||||||||||||
| 391 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 392 | } else { executed 65934 times by 1 test: end of blockExecuted by:
| 65934 | ||||||||||||||||||
| 393 | if (!EC_POINT_get_affine_coordinates(group, a, x0, y0, ctx))
| 0 | ||||||||||||||||||
| 394 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 395 | } never executed: end of block | 0 | ||||||||||||||||||
| 396 | if (b->Z_is_one) {
| 0-65934 | ||||||||||||||||||
| 397 | if (!BN_copy(x1, b->X))
| 0-65934 | ||||||||||||||||||
| 398 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 399 | if (!BN_copy(y1, b->Y))
| 0-65934 | ||||||||||||||||||
| 400 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 401 | } else { executed 65934 times by 1 test: end of blockExecuted by:
| 65934 | ||||||||||||||||||
| 402 | if (!EC_POINT_get_affine_coordinates(group, b, x1, y1, ctx))
| 0 | ||||||||||||||||||
| 403 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 404 | } never executed: end of block | 0 | ||||||||||||||||||
| 405 | - | |||||||||||||||||||
| 406 | if (BN_GF2m_cmp(x0, x1)) {
| 11764-54170 | ||||||||||||||||||
| 407 | if (!BN_GF2m_add(t, x0, x1))
| 0-11764 | ||||||||||||||||||
| 408 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 409 | if (!BN_GF2m_add(s, y0, y1))
| 0-11764 | ||||||||||||||||||
| 410 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 411 | if (!group->meth->field_div(group, s, s, t, ctx))
| 0-11764 | ||||||||||||||||||
| 412 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 413 | if (!group->meth->field_sqr(group, x2, s, ctx))
| 0-11764 | ||||||||||||||||||
| 414 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 415 | if (!BN_GF2m_add(x2, x2, group->a))
| 0-11764 | ||||||||||||||||||
| 416 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 417 | if (!BN_GF2m_add(x2, x2, s))
| 0-11764 | ||||||||||||||||||
| 418 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 419 | if (!BN_GF2m_add(x2, x2, t))
| 0-11764 | ||||||||||||||||||
| 420 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 421 | } else { executed 11764 times by 1 test: end of blockExecuted by:
| 11764 | ||||||||||||||||||
| 422 | if (BN_GF2m_cmp(y0, y1) || BN_is_zero(x1)) {
| 0-53885 | ||||||||||||||||||
| 423 | if (!EC_POINT_set_to_infinity(group, r))
| 0-285 | ||||||||||||||||||
| 424 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 425 | ret = 1; | - | ||||||||||||||||||
| 426 | goto err; executed 285 times by 1 test: goto err;Executed by:
| 285 | ||||||||||||||||||
| 427 | } | - | ||||||||||||||||||
| 428 | if (!group->meth->field_div(group, s, y1, x1, ctx))
| 0-53885 | ||||||||||||||||||
| 429 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 430 | if (!BN_GF2m_add(s, s, x1))
| 0-53885 | ||||||||||||||||||
| 431 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 432 | - | |||||||||||||||||||
| 433 | if (!group->meth->field_sqr(group, x2, s, ctx))
| 0-53885 | ||||||||||||||||||
| 434 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 435 | if (!BN_GF2m_add(x2, x2, s))
| 0-53885 | ||||||||||||||||||
| 436 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 437 | if (!BN_GF2m_add(x2, x2, group->a))
| 0-53885 | ||||||||||||||||||
| 438 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 439 | } executed 53885 times by 1 test: end of blockExecuted by:
| 53885 | ||||||||||||||||||
| 440 | - | |||||||||||||||||||
| 441 | if (!BN_GF2m_add(y2, x1, x2))
| 0-65649 | ||||||||||||||||||
| 442 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 443 | if (!group->meth->field_mul(group, y2, y2, s, ctx))
| 0-65649 | ||||||||||||||||||
| 444 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 445 | if (!BN_GF2m_add(y2, y2, x2))
| 0-65649 | ||||||||||||||||||
| 446 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 447 | if (!BN_GF2m_add(y2, y2, y1))
| 0-65649 | ||||||||||||||||||
| 448 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 449 | - | |||||||||||||||||||
| 450 | if (!EC_POINT_set_affine_coordinates(group, r, x2, y2, ctx))
| 0-65649 | ||||||||||||||||||
| 451 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 452 | - | |||||||||||||||||||
| 453 | ret = 1; | - | ||||||||||||||||||
| 454 | - | |||||||||||||||||||
| 455 | err: code before this statement executed 65649 times by 1 test: err:Executed by:
| 65649 | ||||||||||||||||||
| 456 | BN_CTX_end(ctx); | - | ||||||||||||||||||
| 457 | BN_CTX_free(new_ctx); | - | ||||||||||||||||||
| 458 | return ret; executed 65934 times by 1 test: return ret;Executed by:
| 65934 | ||||||||||||||||||
| 459 | } | - | ||||||||||||||||||
| 460 | - | |||||||||||||||||||
| 461 | /* | - | ||||||||||||||||||
| 462 | * Computes 2 * a and stores the result in r. r could be a. Uses algorithm | - | ||||||||||||||||||
| 463 | * A.10.2 of IEEE P1363. | - | ||||||||||||||||||
| 464 | */ | - | ||||||||||||||||||
| 465 | int ec_GF2m_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, | - | ||||||||||||||||||
| 466 | BN_CTX *ctx) | - | ||||||||||||||||||
| 467 | { | - | ||||||||||||||||||
| 468 | return ec_GF2m_simple_add(group, r, a, a, ctx); executed 55015 times by 1 test: return ec_GF2m_simple_add(group, r, a, a, ctx);Executed by:
| 55015 | ||||||||||||||||||
| 469 | } | - | ||||||||||||||||||
| 470 | - | |||||||||||||||||||
| 471 | int ec_GF2m_simple_invert(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) | - | ||||||||||||||||||
| 472 | { | - | ||||||||||||||||||
| 473 | if (EC_POINT_is_at_infinity(group, point) || BN_is_zero(point->Y))
| 0-6230 | ||||||||||||||||||
| 474 | /* point is its own inverse */ | - | ||||||||||||||||||
| 475 | return 1; executed 86 times by 1 test: return 1;Executed by:
| 86 | ||||||||||||||||||
| 476 | - | |||||||||||||||||||
| 477 | if (!EC_POINT_make_affine(group, point, ctx))
| 0-6230 | ||||||||||||||||||
| 478 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 479 | return BN_GF2m_add(point->Y, point->X, point->Y); executed 6230 times by 1 test: return BN_GF2m_add(point->Y, point->X, point->Y);Executed by:
| 6230 | ||||||||||||||||||
| 480 | } | - | ||||||||||||||||||
| 481 | - | |||||||||||||||||||
| 482 | /* Indicates whether the given point is the point at infinity. */ | - | ||||||||||||||||||
| 483 | int ec_GF2m_simple_is_at_infinity(const EC_GROUP *group, | - | ||||||||||||||||||
| 484 | const EC_POINT *point) | - | ||||||||||||||||||
| 485 | { | - | ||||||||||||||||||
| 486 | return BN_is_zero(point->Z); executed 273149 times by 1 test: return BN_is_zero(point->Z);Executed by:
| 273149 | ||||||||||||||||||
| 487 | } | - | ||||||||||||||||||
| 488 | - | |||||||||||||||||||
| 489 | /*- | - | ||||||||||||||||||
| 490 | * Determines whether the given EC_POINT is an actual point on the curve defined | - | ||||||||||||||||||
| 491 | * in the EC_GROUP. A point is valid if it satisfies the Weierstrass equation: | - | ||||||||||||||||||
| 492 | * y^2 + x*y = x^3 + a*x^2 + b. | - | ||||||||||||||||||
| 493 | */ | - | ||||||||||||||||||
| 494 | int ec_GF2m_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, | - | ||||||||||||||||||
| 495 | BN_CTX *ctx) | - | ||||||||||||||||||
| 496 | { | - | ||||||||||||||||||
| 497 | int ret = -1; | - | ||||||||||||||||||
| 498 | BN_CTX *new_ctx = NULL; | - | ||||||||||||||||||
| 499 | BIGNUM *lh, *y2; | - | ||||||||||||||||||
| 500 | int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, | - | ||||||||||||||||||
| 501 | const BIGNUM *, BN_CTX *); | - | ||||||||||||||||||
| 502 | int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); | - | ||||||||||||||||||
| 503 | - | |||||||||||||||||||
| 504 | if (EC_POINT_is_at_infinity(group, point))
| 0-80774 | ||||||||||||||||||
| 505 | return 1; never executed: return 1; | 0 | ||||||||||||||||||
| 506 | - | |||||||||||||||||||
| 507 | field_mul = group->meth->field_mul; | - | ||||||||||||||||||
| 508 | field_sqr = group->meth->field_sqr; | - | ||||||||||||||||||
| 509 | - | |||||||||||||||||||
| 510 | /* only support affine coordinates */ | - | ||||||||||||||||||
| 511 | if (!point->Z_is_one)
| 0-80774 | ||||||||||||||||||
| 512 | return -1; never executed: return -1; | 0 | ||||||||||||||||||
| 513 | - | |||||||||||||||||||
| 514 | if (ctx == NULL) {
| 0-80774 | ||||||||||||||||||
| 515 | ctx = new_ctx = BN_CTX_new(); | - | ||||||||||||||||||
| 516 | if (ctx == NULL)
| 0 | ||||||||||||||||||
| 517 | return -1; never executed: return -1; | 0 | ||||||||||||||||||
| 518 | } never executed: end of block | 0 | ||||||||||||||||||
| 519 | - | |||||||||||||||||||
| 520 | BN_CTX_start(ctx); | - | ||||||||||||||||||
| 521 | y2 = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 522 | lh = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 523 | if (lh == NULL)
| 0-80774 | ||||||||||||||||||
| 524 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 525 | - | |||||||||||||||||||
| 526 | /*- | - | ||||||||||||||||||
| 527 | * We have a curve defined by a Weierstrass equation | - | ||||||||||||||||||
| 528 | * y^2 + x*y = x^3 + a*x^2 + b. | - | ||||||||||||||||||
| 529 | * <=> x^3 + a*x^2 + x*y + b + y^2 = 0 | - | ||||||||||||||||||
| 530 | * <=> ((x + a) * x + y ) * x + b + y^2 = 0 | - | ||||||||||||||||||
| 531 | */ | - | ||||||||||||||||||
| 532 | if (!BN_GF2m_add(lh, point->X, group->a))
| 0-80774 | ||||||||||||||||||
| 533 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 534 | if (!field_mul(group, lh, lh, point->X, ctx))
| 0-80774 | ||||||||||||||||||
| 535 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 536 | if (!BN_GF2m_add(lh, lh, point->Y))
| 0-80774 | ||||||||||||||||||
| 537 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 538 | if (!field_mul(group, lh, lh, point->X, ctx))
| 0-80774 | ||||||||||||||||||
| 539 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 540 | if (!BN_GF2m_add(lh, lh, group->b))
| 0-80774 | ||||||||||||||||||
| 541 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 542 | if (!field_sqr(group, y2, point->Y, ctx))
| 0-80774 | ||||||||||||||||||
| 543 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 544 | if (!BN_GF2m_add(lh, lh, y2))
| 0-80774 | ||||||||||||||||||
| 545 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 546 | ret = BN_is_zero(lh); | - | ||||||||||||||||||
| 547 | - | |||||||||||||||||||
| 548 | err: code before this statement executed 80774 times by 1 test: err:Executed by:
| 80774 | ||||||||||||||||||
| 549 | BN_CTX_end(ctx); | - | ||||||||||||||||||
| 550 | BN_CTX_free(new_ctx); | - | ||||||||||||||||||
| 551 | return ret; executed 80774 times by 1 test: return ret;Executed by:
| 80774 | ||||||||||||||||||
| 552 | } | - | ||||||||||||||||||
| 553 | - | |||||||||||||||||||
| 554 | /*- | - | ||||||||||||||||||
| 555 | * Indicates whether two points are equal. | - | ||||||||||||||||||
| 556 | * Return values: | - | ||||||||||||||||||
| 557 | * -1 error | - | ||||||||||||||||||
| 558 | * 0 equal (in affine coordinates) | - | ||||||||||||||||||
| 559 | * 1 not equal | - | ||||||||||||||||||
| 560 | */ | - | ||||||||||||||||||
| 561 | int ec_GF2m_simple_cmp(const EC_GROUP *group, const EC_POINT *a, | - | ||||||||||||||||||
| 562 | const EC_POINT *b, BN_CTX *ctx) | - | ||||||||||||||||||
| 563 | { | - | ||||||||||||||||||
| 564 | BIGNUM *aX, *aY, *bX, *bY; | - | ||||||||||||||||||
| 565 | BN_CTX *new_ctx = NULL; | - | ||||||||||||||||||
| 566 | int ret = -1; | - | ||||||||||||||||||
| 567 | - | |||||||||||||||||||
| 568 | if (EC_POINT_is_at_infinity(group, a)) {
| 0-2033 | ||||||||||||||||||
| 569 | return EC_POINT_is_at_infinity(group, b) ? 0 : 1; never executed: return EC_POINT_is_at_infinity(group, b) ? 0 : 1;
| 0 | ||||||||||||||||||
| 570 | } | - | ||||||||||||||||||
| 571 | - | |||||||||||||||||||
| 572 | if (EC_POINT_is_at_infinity(group, b))
| 0-2033 | ||||||||||||||||||
| 573 | return 1; never executed: return 1; | 0 | ||||||||||||||||||
| 574 | - | |||||||||||||||||||
| 575 | if (a->Z_is_one && b->Z_is_one) {
| 0-2033 | ||||||||||||||||||
| 576 | return ((BN_cmp(a->X, b->X) == 0) && BN_cmp(a->Y, b->Y) == 0) ? 0 : 1; executed 2033 times by 1 test: return ((BN_cmp(a->X, b->X) == 0) && BN_cmp(a->Y, b->Y) == 0) ? 0 : 1;Executed by:
| 0-2033 | ||||||||||||||||||
| 577 | } | - | ||||||||||||||||||
| 578 | - | |||||||||||||||||||
| 579 | if (ctx == NULL) {
| 0 | ||||||||||||||||||
| 580 | ctx = new_ctx = BN_CTX_new(); | - | ||||||||||||||||||
| 581 | if (ctx == NULL)
| 0 | ||||||||||||||||||
| 582 | return -1; never executed: return -1; | 0 | ||||||||||||||||||
| 583 | } never executed: end of block | 0 | ||||||||||||||||||
| 584 | - | |||||||||||||||||||
| 585 | BN_CTX_start(ctx); | - | ||||||||||||||||||
| 586 | aX = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 587 | aY = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 588 | bX = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 589 | bY = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 590 | if (bY == NULL)
| 0 | ||||||||||||||||||
| 591 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 592 | - | |||||||||||||||||||
| 593 | if (!EC_POINT_get_affine_coordinates(group, a, aX, aY, ctx))
| 0 | ||||||||||||||||||
| 594 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 595 | if (!EC_POINT_get_affine_coordinates(group, b, bX, bY, ctx))
| 0 | ||||||||||||||||||
| 596 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 597 | ret = ((BN_cmp(aX, bX) == 0) && BN_cmp(aY, bY) == 0) ? 0 : 1;
| 0 | ||||||||||||||||||
| 598 | - | |||||||||||||||||||
| 599 | err: code before this statement never executed: err: | 0 | ||||||||||||||||||
| 600 | BN_CTX_end(ctx); | - | ||||||||||||||||||
| 601 | BN_CTX_free(new_ctx); | - | ||||||||||||||||||
| 602 | return ret; never executed: return ret; | 0 | ||||||||||||||||||
| 603 | } | - | ||||||||||||||||||
| 604 | - | |||||||||||||||||||
| 605 | /* Forces the given EC_POINT to internally use affine coordinates. */ | - | ||||||||||||||||||
| 606 | int ec_GF2m_simple_make_affine(const EC_GROUP *group, EC_POINT *point, | - | ||||||||||||||||||
| 607 | BN_CTX *ctx) | - | ||||||||||||||||||
| 608 | { | - | ||||||||||||||||||
| 609 | BN_CTX *new_ctx = NULL; | - | ||||||||||||||||||
| 610 | BIGNUM *x, *y; | - | ||||||||||||||||||
| 611 | int ret = 0; | - | ||||||||||||||||||
| 612 | - | |||||||||||||||||||
| 613 | if (point->Z_is_one || EC_POINT_is_at_infinity(group, point))
| 0-7950 | ||||||||||||||||||
| 614 | return 1; executed 10814 times by 1 test: return 1;Executed by:
| 10814 | ||||||||||||||||||
| 615 | - | |||||||||||||||||||
| 616 | if (ctx == NULL) {
| 0 | ||||||||||||||||||
| 617 | ctx = new_ctx = BN_CTX_new(); | - | ||||||||||||||||||
| 618 | if (ctx == NULL)
| 0 | ||||||||||||||||||
| 619 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 620 | } never executed: end of block | 0 | ||||||||||||||||||
| 621 | - | |||||||||||||||||||
| 622 | BN_CTX_start(ctx); | - | ||||||||||||||||||
| 623 | x = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 624 | y = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 625 | if (y == NULL)
| 0 | ||||||||||||||||||
| 626 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 627 | - | |||||||||||||||||||
| 628 | if (!EC_POINT_get_affine_coordinates(group, point, x, y, ctx))
| 0 | ||||||||||||||||||
| 629 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 630 | if (!BN_copy(point->X, x))
| 0 | ||||||||||||||||||
| 631 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 632 | if (!BN_copy(point->Y, y))
| 0 | ||||||||||||||||||
| 633 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 634 | if (!BN_one(point->Z))
| 0 | ||||||||||||||||||
| 635 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 636 | point->Z_is_one = 1; | - | ||||||||||||||||||
| 637 | - | |||||||||||||||||||
| 638 | ret = 1; | - | ||||||||||||||||||
| 639 | - | |||||||||||||||||||
| 640 | err: code before this statement never executed: err: | 0 | ||||||||||||||||||
| 641 | BN_CTX_end(ctx); | - | ||||||||||||||||||
| 642 | BN_CTX_free(new_ctx); | - | ||||||||||||||||||
| 643 | return ret; never executed: return ret; | 0 | ||||||||||||||||||
| 644 | } | - | ||||||||||||||||||
| 645 | - | |||||||||||||||||||
| 646 | /* | - | ||||||||||||||||||
| 647 | * Forces each of the EC_POINTs in the given array to use affine coordinates. | - | ||||||||||||||||||
| 648 | */ | - | ||||||||||||||||||
| 649 | int ec_GF2m_simple_points_make_affine(const EC_GROUP *group, size_t num, | - | ||||||||||||||||||
| 650 | EC_POINT *points[], BN_CTX *ctx) | - | ||||||||||||||||||
| 651 | { | - | ||||||||||||||||||
| 652 | size_t i; | - | ||||||||||||||||||
| 653 | - | |||||||||||||||||||
| 654 | for (i = 0; i < num; i++) {
| 212-4584 | ||||||||||||||||||
| 655 | if (!group->meth->make_affine(group, points[i], ctx))
| 0-4584 | ||||||||||||||||||
| 656 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 657 | } executed 4584 times by 1 test: end of blockExecuted by:
| 4584 | ||||||||||||||||||
| 658 | - | |||||||||||||||||||
| 659 | return 1; executed 212 times by 1 test: return 1;Executed by:
| 212 | ||||||||||||||||||
| 660 | } | - | ||||||||||||||||||
| 661 | - | |||||||||||||||||||
| 662 | /* Wrapper to simple binary polynomial field multiplication implementation. */ | - | ||||||||||||||||||
| 663 | int ec_GF2m_simple_field_mul(const EC_GROUP *group, BIGNUM *r, | - | ||||||||||||||||||
| 664 | const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) | - | ||||||||||||||||||
| 665 | { | - | ||||||||||||||||||
| 666 | return BN_GF2m_mod_mul_arr(r, a, b, group->poly, ctx); executed 3593851 times by 1 test: return BN_GF2m_mod_mul_arr(r, a, b, group->poly, ctx);Executed by:
| 3593851 | ||||||||||||||||||
| 667 | } | - | ||||||||||||||||||
| 668 | - | |||||||||||||||||||
| 669 | /* Wrapper to simple binary polynomial field squaring implementation. */ | - | ||||||||||||||||||
| 670 | int ec_GF2m_simple_field_sqr(const EC_GROUP *group, BIGNUM *r, | - | ||||||||||||||||||
| 671 | const BIGNUM *a, BN_CTX *ctx) | - | ||||||||||||||||||
| 672 | { | - | ||||||||||||||||||
| 673 | return BN_GF2m_mod_sqr_arr(r, a, group->poly, ctx); executed 2941761 times by 1 test: return BN_GF2m_mod_sqr_arr(r, a, group->poly, ctx);Executed by:
| 2941761 | ||||||||||||||||||
| 674 | } | - | ||||||||||||||||||
| 675 | - | |||||||||||||||||||
| 676 | /* Wrapper to simple binary polynomial field division implementation. */ | - | ||||||||||||||||||
| 677 | int ec_GF2m_simple_field_div(const EC_GROUP *group, BIGNUM *r, | - | ||||||||||||||||||
| 678 | const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) | - | ||||||||||||||||||
| 679 | { | - | ||||||||||||||||||
| 680 | return BN_GF2m_mod_div(r, a, b, group->field, ctx); executed 71165 times by 1 test: return BN_GF2m_mod_div(r, a, b, group->field, ctx);Executed by:
| 71165 | ||||||||||||||||||
| 681 | } | - | ||||||||||||||||||
| 682 | - | |||||||||||||||||||
| 683 | /*- | - | ||||||||||||||||||
| 684 | * Lopez-Dahab ladder, pre step. | - | ||||||||||||||||||
| 685 | * See e.g. "Guide to ECC" Alg 3.40. | - | ||||||||||||||||||
| 686 | * Modified to blind s and r independently. | - | ||||||||||||||||||
| 687 | * s:= p, r := 2p | - | ||||||||||||||||||
| 688 | */ | - | ||||||||||||||||||
| 689 | static | - | ||||||||||||||||||
| 690 | int ec_GF2m_simple_ladder_pre(const EC_GROUP *group, | - | ||||||||||||||||||
| 691 | EC_POINT *r, EC_POINT *s, | - | ||||||||||||||||||
| 692 | EC_POINT *p, BN_CTX *ctx) | - | ||||||||||||||||||
| 693 | { | - | ||||||||||||||||||
| 694 | /* if p is not affine, something is wrong */ | - | ||||||||||||||||||
| 695 | if (p->Z_is_one == 0)
| 0-2126 | ||||||||||||||||||
| 696 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 697 | - | |||||||||||||||||||
| 698 | /* s blinding: make sure lambda (s->Z here) is not zero */ | - | ||||||||||||||||||
| 699 | do { | - | ||||||||||||||||||
| 700 | if (!BN_priv_rand(s->Z, BN_num_bits(group->field) - 1,
| 0-2126 | ||||||||||||||||||
| 701 | BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY)) {
| 0-2126 | ||||||||||||||||||
| 702 | ECerr(EC_F_EC_GF2M_SIMPLE_LADDER_PRE, ERR_R_BN_LIB); | - | ||||||||||||||||||
| 703 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 704 | } | - | ||||||||||||||||||
| 705 | } while (BN_is_zero(s->Z)); executed 2126 times by 1 test: end of blockExecuted by:
| 0-2126 | ||||||||||||||||||
| 706 | - | |||||||||||||||||||
| 707 | /* if field_encode defined convert between representations */ | - | ||||||||||||||||||
| 708 | if ((group->meth->field_encode != NULL
| 0-2126 | ||||||||||||||||||
| 709 | && !group->meth->field_encode(group, s->Z, s->Z, ctx))
| 0 | ||||||||||||||||||
| 710 | || !group->meth->field_mul(group, s->X, p->X, s->Z, ctx))
| 0-2126 | ||||||||||||||||||
| 711 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 712 | - | |||||||||||||||||||
| 713 | /* r blinding: make sure lambda (r->Y here for storage) is not zero */ | - | ||||||||||||||||||
| 714 | do { | - | ||||||||||||||||||
| 715 | if (!BN_priv_rand(r->Y, BN_num_bits(group->field) - 1,
| 0-2126 | ||||||||||||||||||
| 716 | BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY)) {
| 0-2126 | ||||||||||||||||||
| 717 | ECerr(EC_F_EC_GF2M_SIMPLE_LADDER_PRE, ERR_R_BN_LIB); | - | ||||||||||||||||||
| 718 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 719 | } | - | ||||||||||||||||||
| 720 | } while (BN_is_zero(r->Y)); executed 2126 times by 1 test: end of blockExecuted by:
| 0-2126 | ||||||||||||||||||
| 721 | - | |||||||||||||||||||
| 722 | if ((group->meth->field_encode != NULL
| 0-2126 | ||||||||||||||||||
| 723 | && !group->meth->field_encode(group, r->Y, r->Y, ctx))
| 0 | ||||||||||||||||||
| 724 | || !group->meth->field_sqr(group, r->Z, p->X, ctx)
| 0-2126 | ||||||||||||||||||
| 725 | || !group->meth->field_sqr(group, r->X, r->Z, ctx)
| 0-2126 | ||||||||||||||||||
| 726 | || !BN_GF2m_add(r->X, r->X, group->b)
| 0-2126 | ||||||||||||||||||
| 727 | || !group->meth->field_mul(group, r->Z, r->Z, r->Y, ctx)
| 0-2126 | ||||||||||||||||||
| 728 | || !group->meth->field_mul(group, r->X, r->X, r->Y, ctx))
| 0-2126 | ||||||||||||||||||
| 729 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 730 | - | |||||||||||||||||||
| 731 | s->Z_is_one = 0; | - | ||||||||||||||||||
| 732 | r->Z_is_one = 0; | - | ||||||||||||||||||
| 733 | - | |||||||||||||||||||
| 734 | return 1; executed 2126 times by 1 test: return 1;Executed by:
| 2126 | ||||||||||||||||||
| 735 | } | - | ||||||||||||||||||
| 736 | - | |||||||||||||||||||
| 737 | /*- | - | ||||||||||||||||||
| 738 | * Ladder step: differential addition-and-doubling, mixed Lopez-Dahab coords. | - | ||||||||||||||||||
| 739 | * http://www.hyperelliptic.org/EFD/g12o/auto-code/shortw/xz/ladder/mladd-2003-s.op3 | - | ||||||||||||||||||
| 740 | * s := r + s, r := 2r | - | ||||||||||||||||||
| 741 | */ | - | ||||||||||||||||||
| 742 | static | - | ||||||||||||||||||
| 743 | int ec_GF2m_simple_ladder_step(const EC_GROUP *group, | - | ||||||||||||||||||
| 744 | EC_POINT *r, EC_POINT *s, | - | ||||||||||||||||||
| 745 | EC_POINT *p, BN_CTX *ctx) | - | ||||||||||||||||||
| 746 | { | - | ||||||||||||||||||
| 747 | if (!group->meth->field_mul(group, r->Y, r->Z, s->X, ctx)
| 0-556906 | ||||||||||||||||||
| 748 | || !group->meth->field_mul(group, s->X, r->X, s->Z, ctx)
| 0-556906 | ||||||||||||||||||
| 749 | || !group->meth->field_sqr(group, s->Y, r->Z, ctx)
| 0-556906 | ||||||||||||||||||
| 750 | || !group->meth->field_sqr(group, r->Z, r->X, ctx)
| 0-556906 | ||||||||||||||||||
| 751 | || !BN_GF2m_add(s->Z, r->Y, s->X)
| 0-556906 | ||||||||||||||||||
| 752 | || !group->meth->field_sqr(group, s->Z, s->Z, ctx)
| 0-556906 | ||||||||||||||||||
| 753 | || !group->meth->field_mul(group, s->X, r->Y, s->X, ctx)
| 0-556906 | ||||||||||||||||||
| 754 | || !group->meth->field_mul(group, r->Y, s->Z, p->X, ctx)
| 0-556906 | ||||||||||||||||||
| 755 | || !BN_GF2m_add(s->X, s->X, r->Y)
| 0-556906 | ||||||||||||||||||
| 756 | || !group->meth->field_sqr(group, r->Y, r->Z, ctx)
| 0-556906 | ||||||||||||||||||
| 757 | || !group->meth->field_mul(group, r->Z, r->Z, s->Y, ctx)
| 0-556906 | ||||||||||||||||||
| 758 | || !group->meth->field_sqr(group, s->Y, s->Y, ctx)
| 0-556906 | ||||||||||||||||||
| 759 | || !group->meth->field_mul(group, s->Y, s->Y, group->b, ctx)
| 0-556906 | ||||||||||||||||||
| 760 | || !BN_GF2m_add(r->X, r->Y, s->Y))
| 0-556906 | ||||||||||||||||||
| 761 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 762 | - | |||||||||||||||||||
| 763 | return 1; executed 556906 times by 1 test: return 1;Executed by:
| 556906 | ||||||||||||||||||
| 764 | } | - | ||||||||||||||||||
| 765 | - | |||||||||||||||||||
| 766 | /*- | - | ||||||||||||||||||
| 767 | * Recover affine (x,y) result from Lopez-Dahab r and s, affine p. | - | ||||||||||||||||||
| 768 | * See e.g. "Fast Multiplication on Elliptic Curves over GF(2**m) | - | ||||||||||||||||||
| 769 | * without Precomputation" (Lopez and Dahab, CHES 1999), | - | ||||||||||||||||||
| 770 | * Appendix Alg Mxy. | - | ||||||||||||||||||
| 771 | */ | - | ||||||||||||||||||
| 772 | static | - | ||||||||||||||||||
| 773 | int ec_GF2m_simple_ladder_post(const EC_GROUP *group, | - | ||||||||||||||||||
| 774 | EC_POINT *r, EC_POINT *s, | - | ||||||||||||||||||
| 775 | EC_POINT *p, BN_CTX *ctx) | - | ||||||||||||||||||
| 776 | { | - | ||||||||||||||||||
| 777 | int ret = 0; | - | ||||||||||||||||||
| 778 | BIGNUM *t0, *t1, *t2 = NULL; | - | ||||||||||||||||||
| 779 | - | |||||||||||||||||||
| 780 | if (BN_is_zero(r->Z))
| 348-1778 | ||||||||||||||||||
| 781 | return EC_POINT_set_to_infinity(group, r); executed 348 times by 1 test: return EC_POINT_set_to_infinity(group, r);Executed by:
| 348 | ||||||||||||||||||
| 782 | - | |||||||||||||||||||
| 783 | if (BN_is_zero(s->Z)) {
| 156-1622 | ||||||||||||||||||
| 784 | if (!EC_POINT_copy(r, p)
| 0-156 | ||||||||||||||||||
| 785 | || !EC_POINT_invert(group, r, ctx)) {
| 0-156 | ||||||||||||||||||
| 786 | ECerr(EC_F_EC_GF2M_SIMPLE_LADDER_POST, ERR_R_EC_LIB); | - | ||||||||||||||||||
| 787 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 788 | } | - | ||||||||||||||||||
| 789 | return 1; executed 156 times by 1 test: return 1;Executed by:
| 156 | ||||||||||||||||||
| 790 | } | - | ||||||||||||||||||
| 791 | - | |||||||||||||||||||
| 792 | BN_CTX_start(ctx); | - | ||||||||||||||||||
| 793 | t0 = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 794 | t1 = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 795 | t2 = BN_CTX_get(ctx); | - | ||||||||||||||||||
| 796 | if (t2 == NULL) {
| 0-1622 | ||||||||||||||||||
| 797 | ECerr(EC_F_EC_GF2M_SIMPLE_LADDER_POST, ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||
| 798 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 799 | } | - | ||||||||||||||||||
| 800 | - | |||||||||||||||||||
| 801 | if (!group->meth->field_mul(group, t0, r->Z, s->Z, ctx)
| 0-1622 | ||||||||||||||||||
| 802 | || !group->meth->field_mul(group, t1, p->X, r->Z, ctx)
| 0-1622 | ||||||||||||||||||
| 803 | || !BN_GF2m_add(t1, r->X, t1)
| 0-1622 | ||||||||||||||||||
| 804 | || !group->meth->field_mul(group, t2, p->X, s->Z, ctx)
| 0-1622 | ||||||||||||||||||
| 805 | || !group->meth->field_mul(group, r->Z, r->X, t2, ctx)
| 0-1622 | ||||||||||||||||||
| 806 | || !BN_GF2m_add(t2, t2, s->X)
| 0-1622 | ||||||||||||||||||
| 807 | || !group->meth->field_mul(group, t1, t1, t2, ctx)
| 0-1622 | ||||||||||||||||||
| 808 | || !group->meth->field_sqr(group, t2, p->X, ctx)
| 0-1622 | ||||||||||||||||||
| 809 | || !BN_GF2m_add(t2, p->Y, t2)
| 0-1622 | ||||||||||||||||||
| 810 | || !group->meth->field_mul(group, t2, t2, t0, ctx)
| 0-1622 | ||||||||||||||||||
| 811 | || !BN_GF2m_add(t1, t2, t1)
| 0-1622 | ||||||||||||||||||
| 812 | || !group->meth->field_mul(group, t2, p->X, t0, ctx)
| 0-1622 | ||||||||||||||||||
| 813 | || !BN_GF2m_mod_inv(t2, t2, group->field, ctx)
| 0-1622 | ||||||||||||||||||
| 814 | || !group->meth->field_mul(group, t1, t1, t2, ctx)
| 0-1622 | ||||||||||||||||||
| 815 | || !group->meth->field_mul(group, r->X, r->Z, t2, ctx)
| 0-1622 | ||||||||||||||||||
| 816 | || !BN_GF2m_add(t2, p->X, r->X)
| 0-1622 | ||||||||||||||||||
| 817 | || !group->meth->field_mul(group, t2, t2, t1, ctx)
| 0-1622 | ||||||||||||||||||
| 818 | || !BN_GF2m_add(r->Y, p->Y, t2)
| 0-1622 | ||||||||||||||||||
| 819 | || !BN_one(r->Z))
| 0-1622 | ||||||||||||||||||
| 820 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 821 | - | |||||||||||||||||||
| 822 | r->Z_is_one = 1; | - | ||||||||||||||||||
| 823 | - | |||||||||||||||||||
| 824 | /* GF(2^m) field elements should always have BIGNUM::neg = 0 */ | - | ||||||||||||||||||
| 825 | BN_set_negative(r->X, 0); | - | ||||||||||||||||||
| 826 | BN_set_negative(r->Y, 0); | - | ||||||||||||||||||
| 827 | - | |||||||||||||||||||
| 828 | ret = 1; | - | ||||||||||||||||||
| 829 | - | |||||||||||||||||||
| 830 | err: code before this statement executed 1622 times by 1 test: err:Executed by:
| 1622 | ||||||||||||||||||
| 831 | BN_CTX_end(ctx); | - | ||||||||||||||||||
| 832 | return ret; executed 1622 times by 1 test: return ret;Executed by:
| 1622 | ||||||||||||||||||
| 833 | } | - | ||||||||||||||||||
| 834 | - | |||||||||||||||||||
| 835 | static | - | ||||||||||||||||||
| 836 | int ec_GF2m_simple_points_mul(const EC_GROUP *group, EC_POINT *r, | - | ||||||||||||||||||
| 837 | const BIGNUM *scalar, size_t num, | - | ||||||||||||||||||
| 838 | const EC_POINT *points[], | - | ||||||||||||||||||
| 839 | const BIGNUM *scalars[], | - | ||||||||||||||||||
| 840 | BN_CTX *ctx) | - | ||||||||||||||||||
| 841 | { | - | ||||||||||||||||||
| 842 | int ret = 0; | - | ||||||||||||||||||
| 843 | EC_POINT *t = NULL; | - | ||||||||||||||||||
| 844 | - | |||||||||||||||||||
| 845 | /*- | - | ||||||||||||||||||
| 846 | * We limit use of the ladder only to the following cases: | - | ||||||||||||||||||
| 847 | * - r := scalar * G | - | ||||||||||||||||||
| 848 | * Fixed point mul: scalar != NULL && num == 0; | - | ||||||||||||||||||
| 849 | * - r := scalars[0] * points[0] | - | ||||||||||||||||||
| 850 | * Variable point mul: scalar == NULL && num == 1; | - | ||||||||||||||||||
| 851 | * - r := scalar * G + scalars[0] * points[0] | - | ||||||||||||||||||
| 852 | * used, e.g., in ECDSA verification: scalar != NULL && num == 1 | - | ||||||||||||||||||
| 853 | * | - | ||||||||||||||||||
| 854 | * In any other case (num > 1) we use the default wNAF implementation. | - | ||||||||||||||||||
| 855 | * | - | ||||||||||||||||||
| 856 | * We also let the default implementation handle degenerate cases like group | - | ||||||||||||||||||
| 857 | * order or cofactor set to 0. | - | ||||||||||||||||||
| 858 | */ | - | ||||||||||||||||||
| 859 | if (num > 1 || BN_is_zero(group->order) || BN_is_zero(group->cofactor))
| 0-1956 | ||||||||||||||||||
| 860 | return ec_wNAF_mul(group, r, scalar, num, points, scalars, ctx); executed 212 times by 1 test: return ec_wNAF_mul(group, r, scalar, num, points, scalars, ctx);Executed by:
| 212 | ||||||||||||||||||
| 861 | - | |||||||||||||||||||
| 862 | if (scalar != NULL && num == 0)
| 170-1051 | ||||||||||||||||||
| 863 | /* Fixed point multiplication */ | - | ||||||||||||||||||
| 864 | return ec_scalar_mul_ladder(group, r, scalar, NULL, ctx); executed 735 times by 1 test: return ec_scalar_mul_ladder(group, r, scalar, ((void *)0) , ctx);Executed by:
| 735 | ||||||||||||||||||
| 865 | - | |||||||||||||||||||
| 866 | if (scalar == NULL && num == 1)
| 0-1051 | ||||||||||||||||||
| 867 | /* Variable point multiplication */ | - | ||||||||||||||||||
| 868 | return ec_scalar_mul_ladder(group, r, scalars[0], points[0], ctx); executed 1051 times by 1 test: return ec_scalar_mul_ladder(group, r, scalars[0], points[0], ctx);Executed by:
| 1051 | ||||||||||||||||||
| 869 | - | |||||||||||||||||||
| 870 | /*- | - | ||||||||||||||||||
| 871 | * Double point multiplication: | - | ||||||||||||||||||
| 872 | * r := scalar * G + scalars[0] * points[0] | - | ||||||||||||||||||
| 873 | */ | - | ||||||||||||||||||
| 874 | - | |||||||||||||||||||
| 875 | if ((t = EC_POINT_new(group)) == NULL) {
| 0-170 | ||||||||||||||||||
| 876 | ECerr(EC_F_EC_GF2M_SIMPLE_POINTS_MUL, ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||
| 877 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 878 | } | - | ||||||||||||||||||
| 879 | - | |||||||||||||||||||
| 880 | if (!ec_scalar_mul_ladder(group, t, scalar, NULL, ctx)
| 0-170 | ||||||||||||||||||
| 881 | || !ec_scalar_mul_ladder(group, r, scalars[0], points[0], ctx)
| 0-170 | ||||||||||||||||||
| 882 | || !EC_POINT_add(group, r, t, r, ctx))
| 0-170 | ||||||||||||||||||
| 883 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 884 | - | |||||||||||||||||||
| 885 | ret = 1; | - | ||||||||||||||||||
| 886 | - | |||||||||||||||||||
| 887 | err: code before this statement executed 170 times by 1 test: err:Executed by:
| 170 | ||||||||||||||||||
| 888 | EC_POINT_free(t); | - | ||||||||||||||||||
| 889 | return ret; executed 170 times by 1 test: return ret;Executed by:
| 170 | ||||||||||||||||||
| 890 | } | - | ||||||||||||||||||
| 891 | - | |||||||||||||||||||
| 892 | const EC_METHOD *EC_GF2m_simple_method(void) | - | ||||||||||||||||||
| 893 | { | - | ||||||||||||||||||
| 894 | static const EC_METHOD ret = { | - | ||||||||||||||||||
| 895 | EC_FLAGS_DEFAULT_OCT, | - | ||||||||||||||||||
| 896 | NID_X9_62_characteristic_two_field, | - | ||||||||||||||||||
| 897 | ec_GF2m_simple_group_init, | - | ||||||||||||||||||
| 898 | ec_GF2m_simple_group_finish, | - | ||||||||||||||||||
| 899 | ec_GF2m_simple_group_clear_finish, | - | ||||||||||||||||||
| 900 | ec_GF2m_simple_group_copy, | - | ||||||||||||||||||
| 901 | ec_GF2m_simple_group_set_curve, | - | ||||||||||||||||||
| 902 | ec_GF2m_simple_group_get_curve, | - | ||||||||||||||||||
| 903 | ec_GF2m_simple_group_get_degree, | - | ||||||||||||||||||
| 904 | ec_group_simple_order_bits, | - | ||||||||||||||||||
| 905 | ec_GF2m_simple_group_check_discriminant, | - | ||||||||||||||||||
| 906 | ec_GF2m_simple_point_init, | - | ||||||||||||||||||
| 907 | ec_GF2m_simple_point_finish, | - | ||||||||||||||||||
| 908 | ec_GF2m_simple_point_clear_finish, | - | ||||||||||||||||||
| 909 | ec_GF2m_simple_point_copy, | - | ||||||||||||||||||
| 910 | ec_GF2m_simple_point_set_to_infinity, | - | ||||||||||||||||||
| 911 | 0, /* set_Jprojective_coordinates_GFp */ | - | ||||||||||||||||||
| 912 | 0, /* get_Jprojective_coordinates_GFp */ | - | ||||||||||||||||||
| 913 | ec_GF2m_simple_point_set_affine_coordinates, | - | ||||||||||||||||||
| 914 | ec_GF2m_simple_point_get_affine_coordinates, | - | ||||||||||||||||||
| 915 | 0, /* point_set_compressed_coordinates */ | - | ||||||||||||||||||
| 916 | 0, /* point2oct */ | - | ||||||||||||||||||
| 917 | 0, /* oct2point */ | - | ||||||||||||||||||
| 918 | ec_GF2m_simple_add, | - | ||||||||||||||||||
| 919 | ec_GF2m_simple_dbl, | - | ||||||||||||||||||
| 920 | ec_GF2m_simple_invert, | - | ||||||||||||||||||
| 921 | ec_GF2m_simple_is_at_infinity, | - | ||||||||||||||||||
| 922 | ec_GF2m_simple_is_on_curve, | - | ||||||||||||||||||
| 923 | ec_GF2m_simple_cmp, | - | ||||||||||||||||||
| 924 | ec_GF2m_simple_make_affine, | - | ||||||||||||||||||
| 925 | ec_GF2m_simple_points_make_affine, | - | ||||||||||||||||||
| 926 | ec_GF2m_simple_points_mul, | - | ||||||||||||||||||
| 927 | 0, /* precompute_mult */ | - | ||||||||||||||||||
| 928 | 0, /* have_precompute_mult */ | - | ||||||||||||||||||
| 929 | ec_GF2m_simple_field_mul, | - | ||||||||||||||||||
| 930 | ec_GF2m_simple_field_sqr, | - | ||||||||||||||||||
| 931 | ec_GF2m_simple_field_div, | - | ||||||||||||||||||
| 932 | 0, /* field_encode */ | - | ||||||||||||||||||
| 933 | 0, /* field_decode */ | - | ||||||||||||||||||
| 934 | 0, /* field_set_to_one */ | - | ||||||||||||||||||
| 935 | ec_key_simple_priv2oct, | - | ||||||||||||||||||
| 936 | ec_key_simple_oct2priv, | - | ||||||||||||||||||
| 937 | 0, /* set private */ | - | ||||||||||||||||||
| 938 | ec_key_simple_generate_key, | - | ||||||||||||||||||
| 939 | ec_key_simple_check_key, | - | ||||||||||||||||||
| 940 | ec_key_simple_generate_public_key, | - | ||||||||||||||||||
| 941 | 0, /* keycopy */ | - | ||||||||||||||||||
| 942 | 0, /* keyfinish */ | - | ||||||||||||||||||
| 943 | ecdh_simple_compute_key, | - | ||||||||||||||||||
| 944 | 0, /* field_inverse_mod_ord */ | - | ||||||||||||||||||
| 945 | 0, /* blind_coordinates */ | - | ||||||||||||||||||
| 946 | ec_GF2m_simple_ladder_pre, | - | ||||||||||||||||||
| 947 | ec_GF2m_simple_ladder_step, | - | ||||||||||||||||||
| 948 | ec_GF2m_simple_ladder_post | - | ||||||||||||||||||
| 949 | }; | - | ||||||||||||||||||
| 950 | - | |||||||||||||||||||
| 951 | return &ret; executed 9631 times by 1 test: return &ret;Executed by:
| 9631 | ||||||||||||||||||
| 952 | } | - | ||||||||||||||||||
| 953 | - | |||||||||||||||||||
| 954 | #endif | - | ||||||||||||||||||
| Source code | Switch to Preprocessed file |