diff options
author | Ted Unangst <tedu@cvs.openbsd.org> | 2014-05-06 03:56:28 +0000 |
---|---|---|
committer | Ted Unangst <tedu@cvs.openbsd.org> | 2014-05-06 03:56:28 +0000 |
commit | 74f63d120ed255e6b461e757758a5615966ba04c (patch) | |
tree | 68dc25534cbd34d31dc84d352c9507bcb5fdd7af /lib/libcrypto/ec/ec_key.c | |
parent | 17a71c4c49ea8f2fbdacfd55d8775a2cdf337243 (diff) |
knf approximation
Diffstat (limited to 'lib/libcrypto/ec/ec_key.c')
-rw-r--r-- | lib/libcrypto/ec/ec_key.c | 434 |
1 files changed, 219 insertions, 215 deletions
diff --git a/lib/libcrypto/ec/ec_key.c b/lib/libcrypto/ec/ec_key.c index 4f0559591ed..1d727ec77da 100644 --- a/lib/libcrypto/ec/ec_key.c +++ b/lib/libcrypto/ec/ec_key.c @@ -10,7 +10,7 @@ * are met: * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in @@ -57,7 +57,7 @@ */ /* ==================================================================== * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. - * Portions originally developed by SUN MICROSYSTEMS, INC., and + * Portions originally developed by SUN MICROSYSTEMS, INC., and * contributed to the OpenSSL project. */ @@ -65,78 +65,79 @@ #include "ec_lcl.h" #include <openssl/err.h> -EC_KEY *EC_KEY_new(void) - { +EC_KEY * +EC_KEY_new(void) +{ EC_KEY *ret; - ret=(EC_KEY *)malloc(sizeof(EC_KEY)); - if (ret == NULL) - { + ret = (EC_KEY *) malloc(sizeof(EC_KEY)); + if (ret == NULL) { ECerr(EC_F_EC_KEY_NEW, ERR_R_MALLOC_FAILURE); - return(NULL); - } - - ret->version = 1; + return (NULL); + } + ret->version = 1; ret->flags = 0; - ret->group = NULL; + ret->group = NULL; ret->pub_key = NULL; - ret->priv_key= NULL; - ret->enc_flag= 0; + ret->priv_key = NULL; + ret->enc_flag = 0; ret->conv_form = POINT_CONVERSION_UNCOMPRESSED; - ret->references= 1; + ret->references = 1; ret->method_data = NULL; - return(ret); - } + return (ret); +} -EC_KEY *EC_KEY_new_by_curve_name(int nid) - { +EC_KEY * +EC_KEY_new_by_curve_name(int nid) +{ EC_KEY *ret = EC_KEY_new(); if (ret == NULL) return NULL; ret->group = EC_GROUP_new_by_curve_name(nid); - if (ret->group == NULL) - { + if (ret->group == NULL) { EC_KEY_free(ret); return NULL; - } - return ret; } + return ret; +} -void EC_KEY_free(EC_KEY *r) - { +void +EC_KEY_free(EC_KEY * r) +{ int i; - if (r == NULL) return; + if (r == NULL) + return; - i=CRYPTO_add(&r->references,-1,CRYPTO_LOCK_EC); - if (i > 0) return; + i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_EC); + if (i > 0) + return; - if (r->group != NULL) + if (r->group != NULL) EC_GROUP_free(r->group); - if (r->pub_key != NULL) + if (r->pub_key != NULL) EC_POINT_free(r->pub_key); if (r->priv_key != NULL) BN_clear_free(r->priv_key); EC_EX_DATA_free_all_data(&r->method_data); - OPENSSL_cleanse((void *)r, sizeof(EC_KEY)); + OPENSSL_cleanse((void *) r, sizeof(EC_KEY)); free(r); - } +} -EC_KEY *EC_KEY_copy(EC_KEY *dest, const EC_KEY *src) - { +EC_KEY * +EC_KEY_copy(EC_KEY * dest, const EC_KEY * src) +{ EC_EXTRA_DATA *d; - if (dest == NULL || src == NULL) - { + if (dest == NULL || src == NULL) { ECerr(EC_F_EC_KEY_COPY, ERR_R_PASSED_NULL_PARAMETER); return NULL; - } + } /* copy the parameters */ - if (src->group) - { + if (src->group) { const EC_METHOD *meth = EC_GROUP_method_of(src->group); /* clear the old group */ if (dest->group) @@ -146,10 +147,9 @@ EC_KEY *EC_KEY_copy(EC_KEY *dest, const EC_KEY *src) return NULL; if (!EC_GROUP_copy(dest->group, src->group)) return NULL; - } - /* copy the public key */ - if (src->pub_key && src->group) - { + } + /* copy the public key */ + if (src->pub_key && src->group) { if (dest->pub_key) EC_POINT_free(dest->pub_key); dest->pub_key = EC_POINT_new(src->group); @@ -157,83 +157,81 @@ EC_KEY *EC_KEY_copy(EC_KEY *dest, const EC_KEY *src) return NULL; if (!EC_POINT_copy(dest->pub_key, src->pub_key)) return NULL; - } + } /* copy the private key */ - if (src->priv_key) - { - if (dest->priv_key == NULL) - { + if (src->priv_key) { + if (dest->priv_key == NULL) { dest->priv_key = BN_new(); if (dest->priv_key == NULL) return NULL; - } + } if (!BN_copy(dest->priv_key, src->priv_key)) return NULL; - } + } /* copy method/extra data */ EC_EX_DATA_free_all_data(&dest->method_data); - for (d = src->method_data; d != NULL; d = d->next) - { + for (d = src->method_data; d != NULL; d = d->next) { void *t = d->dup_func(d->data); - + if (t == NULL) return 0; - if (!EC_EX_DATA_set_data(&dest->method_data, t, d->dup_func, d->free_func, d->clear_free_func)) + if (!EC_EX_DATA_set_data(&dest->method_data, t, d->dup_func, + d->free_func, d->clear_free_func)) return 0; - } + } /* copy the rest */ - dest->enc_flag = src->enc_flag; + dest->enc_flag = src->enc_flag; dest->conv_form = src->conv_form; - dest->version = src->version; + dest->version = src->version; dest->flags = src->flags; return dest; - } +} -EC_KEY *EC_KEY_dup(const EC_KEY *ec_key) - { +EC_KEY * +EC_KEY_dup(const EC_KEY * ec_key) +{ EC_KEY *ret = EC_KEY_new(); if (ret == NULL) return NULL; - if (EC_KEY_copy(ret, ec_key) == NULL) - { + if (EC_KEY_copy(ret, ec_key) == NULL) { EC_KEY_free(ret); return NULL; - } - return ret; } + return ret; +} -int EC_KEY_up_ref(EC_KEY *r) - { +int +EC_KEY_up_ref(EC_KEY * r) +{ int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_EC); return ((i > 1) ? 1 : 0); - } +} -int EC_KEY_generate_key(EC_KEY *eckey) - { - int ok = 0; - BN_CTX *ctx = NULL; - BIGNUM *priv_key = NULL, *order = NULL; +int +EC_KEY_generate_key(EC_KEY * eckey) +{ + int ok = 0; + BN_CTX *ctx = NULL; + BIGNUM *priv_key = NULL, *order = NULL; EC_POINT *pub_key = NULL; - if (!eckey || !eckey->group) - { + if (!eckey || !eckey->group) { ECerr(EC_F_EC_KEY_GENERATE_KEY, ERR_R_PASSED_NULL_PARAMETER); return 0; - } - - if ((order = BN_new()) == NULL) goto err; - if ((ctx = BN_CTX_new()) == NULL) goto err; + } + if ((order = BN_new()) == NULL) + goto err; + if ((ctx = BN_CTX_new()) == NULL) + goto err; - if (eckey->priv_key == NULL) - { + if (eckey->priv_key == NULL) { priv_key = BN_new(); if (priv_key == NULL) goto err; - } - else + } else priv_key = eckey->priv_key; if (!EC_GROUP_get_order(eckey->group, order, ctx)) @@ -244,127 +242,115 @@ int EC_KEY_generate_key(EC_KEY *eckey) goto err; while (BN_is_zero(priv_key)); - if (eckey->pub_key == NULL) - { + if (eckey->pub_key == NULL) { pub_key = EC_POINT_new(eckey->group); if (pub_key == NULL) goto err; - } - else + } else pub_key = eckey->pub_key; if (!EC_POINT_mul(eckey->group, pub_key, priv_key, NULL, NULL, ctx)) goto err; eckey->priv_key = priv_key; - eckey->pub_key = pub_key; + eckey->pub_key = pub_key; - ok=1; + ok = 1; -err: +err: if (order) BN_free(order); - if (pub_key != NULL && eckey->pub_key == NULL) + if (pub_key != NULL && eckey->pub_key == NULL) EC_POINT_free(pub_key); if (priv_key != NULL && eckey->priv_key == NULL) BN_free(priv_key); if (ctx != NULL) BN_CTX_free(ctx); - return(ok); - } + return (ok); +} -int EC_KEY_check_key(const EC_KEY *eckey) - { - int ok = 0; - BN_CTX *ctx = NULL; - const BIGNUM *order = NULL; +int +EC_KEY_check_key(const EC_KEY * eckey) +{ + int ok = 0; + BN_CTX *ctx = NULL; + const BIGNUM *order = NULL; EC_POINT *point = NULL; - if (!eckey || !eckey->group || !eckey->pub_key) - { + if (!eckey || !eckey->group || !eckey->pub_key) { ECerr(EC_F_EC_KEY_CHECK_KEY, ERR_R_PASSED_NULL_PARAMETER); return 0; - } - - if (EC_POINT_is_at_infinity(eckey->group, eckey->pub_key)) - { + } + if (EC_POINT_is_at_infinity(eckey->group, eckey->pub_key)) { ECerr(EC_F_EC_KEY_CHECK_KEY, EC_R_POINT_AT_INFINITY); goto err; - } - + } if ((ctx = BN_CTX_new()) == NULL) goto err; if ((point = EC_POINT_new(eckey->group)) == NULL) goto err; /* testing whether the pub_key is on the elliptic curve */ - if (!EC_POINT_is_on_curve(eckey->group, eckey->pub_key, ctx)) - { + if (!EC_POINT_is_on_curve(eckey->group, eckey->pub_key, ctx)) { ECerr(EC_F_EC_KEY_CHECK_KEY, EC_R_POINT_IS_NOT_ON_CURVE); goto err; - } + } /* testing whether pub_key * order is the point at infinity */ order = &eckey->group->order; - if (BN_is_zero(order)) - { + if (BN_is_zero(order)) { ECerr(EC_F_EC_KEY_CHECK_KEY, EC_R_INVALID_GROUP_ORDER); goto err; - } - if (!EC_POINT_mul(eckey->group, point, NULL, eckey->pub_key, order, ctx)) - { + } + if (!EC_POINT_mul(eckey->group, point, NULL, eckey->pub_key, order, ctx)) { ECerr(EC_F_EC_KEY_CHECK_KEY, ERR_R_EC_LIB); goto err; - } - if (!EC_POINT_is_at_infinity(eckey->group, point)) - { + } + if (!EC_POINT_is_at_infinity(eckey->group, point)) { ECerr(EC_F_EC_KEY_CHECK_KEY, EC_R_WRONG_ORDER); goto err; - } - /* in case the priv_key is present : - * check if generator * priv_key == pub_key + } + /* + * in case the priv_key is present : check if generator * priv_key == + * pub_key */ - if (eckey->priv_key) - { - if (BN_cmp(eckey->priv_key, order) >= 0) - { + if (eckey->priv_key) { + if (BN_cmp(eckey->priv_key, order) >= 0) { ECerr(EC_F_EC_KEY_CHECK_KEY, EC_R_WRONG_ORDER); goto err; - } + } if (!EC_POINT_mul(eckey->group, point, eckey->priv_key, - NULL, NULL, ctx)) - { + NULL, NULL, ctx)) { ECerr(EC_F_EC_KEY_CHECK_KEY, ERR_R_EC_LIB); goto err; - } - if (EC_POINT_cmp(eckey->group, point, eckey->pub_key, - ctx) != 0) - { + } + if (EC_POINT_cmp(eckey->group, point, eckey->pub_key, + ctx) != 0) { ECerr(EC_F_EC_KEY_CHECK_KEY, EC_R_INVALID_PRIVATE_KEY); goto err; - } } + } ok = 1; err: - if (ctx != NULL) + if (ctx != NULL) BN_CTX_free(ctx); if (point != NULL) EC_POINT_free(point); - return(ok); - } + return (ok); +} -int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, BIGNUM *y) - { +int +EC_KEY_set_public_key_affine_coordinates(EC_KEY * key, BIGNUM * x, BIGNUM * y) +{ BN_CTX *ctx = NULL; BIGNUM *tx, *ty; EC_POINT *point = NULL; int ok = 0, tmp_nid, is_char_two = 0; - if (!key || !key->group || !x || !y) - { + if (!key || !key->group || !x || !y) { ECerr(EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES, - ERR_R_PASSED_NULL_PARAMETER); + ERR_R_PASSED_NULL_PARAMETER); return 0; - } + } ctx = BN_CTX_new(); if (!ctx) goto err; @@ -376,41 +362,38 @@ int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, BIGNUM *y) tmp_nid = EC_METHOD_get_field_type(EC_GROUP_method_of(key->group)); - if (tmp_nid == NID_X9_62_characteristic_two_field) + if (tmp_nid == NID_X9_62_characteristic_two_field) is_char_two = 1; tx = BN_CTX_get(ctx); ty = BN_CTX_get(ctx); #ifndef OPENSSL_NO_EC2M - if (is_char_two) - { + if (is_char_two) { if (!EC_POINT_set_affine_coordinates_GF2m(key->group, point, - x, y, ctx)) + x, y, ctx)) goto err; if (!EC_POINT_get_affine_coordinates_GF2m(key->group, point, - tx, ty, ctx)) + tx, ty, ctx)) goto err; - } - else + } else #endif - { + { if (!EC_POINT_set_affine_coordinates_GFp(key->group, point, - x, y, ctx)) + x, y, ctx)) goto err; if (!EC_POINT_get_affine_coordinates_GFp(key->group, point, - tx, ty, ctx)) + tx, ty, ctx)) goto err; - } - /* Check if retrieved coordinates match originals: if not values - * are out of range. + } + /* + * Check if retrieved coordinates match originals: if not values are + * out of range. */ - if (BN_cmp(x, tx) || BN_cmp(y, ty)) - { + if (BN_cmp(x, tx) || BN_cmp(y, ty)) { ECerr(EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES, - EC_R_COORDINATES_OUT_OF_RANGE); + EC_R_COORDINATES_OUT_OF_RANGE); goto err; - } - + } if (!EC_KEY_set_public_key(key, point)) goto err; @@ -419,79 +402,92 @@ int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, BIGNUM *y) ok = 1; - err: +err: if (ctx) BN_CTX_free(ctx); if (point) EC_POINT_free(point); return ok; - } +} -const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key) - { +const EC_GROUP * +EC_KEY_get0_group(const EC_KEY * key) +{ return key->group; - } +} -int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group) - { +int +EC_KEY_set_group(EC_KEY * key, const EC_GROUP * group) +{ if (key->group != NULL) EC_GROUP_free(key->group); key->group = EC_GROUP_dup(group); return (key->group == NULL) ? 0 : 1; - } +} -const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key) - { +const BIGNUM * +EC_KEY_get0_private_key(const EC_KEY * key) +{ return key->priv_key; - } +} -int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *priv_key) - { +int +EC_KEY_set_private_key(EC_KEY * key, const BIGNUM * priv_key) +{ if (key->priv_key) BN_clear_free(key->priv_key); key->priv_key = BN_dup(priv_key); return (key->priv_key == NULL) ? 0 : 1; - } +} -const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key) - { +const EC_POINT * +EC_KEY_get0_public_key(const EC_KEY * key) +{ return key->pub_key; - } +} -int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub_key) - { +int +EC_KEY_set_public_key(EC_KEY * key, const EC_POINT * pub_key) +{ if (key->pub_key != NULL) EC_POINT_free(key->pub_key); key->pub_key = EC_POINT_dup(pub_key, key->group); return (key->pub_key == NULL) ? 0 : 1; - } +} -unsigned int EC_KEY_get_enc_flags(const EC_KEY *key) - { +unsigned int +EC_KEY_get_enc_flags(const EC_KEY * key) +{ return key->enc_flag; - } +} -void EC_KEY_set_enc_flags(EC_KEY *key, unsigned int flags) - { +void +EC_KEY_set_enc_flags(EC_KEY * key, unsigned int flags) +{ key->enc_flag = flags; - } +} -point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key) - { +point_conversion_form_t +EC_KEY_get_conv_form(const EC_KEY * key) +{ return key->conv_form; - } +} -void EC_KEY_set_conv_form(EC_KEY *key, point_conversion_form_t cform) - { +void +EC_KEY_set_conv_form(EC_KEY * key, point_conversion_form_t cform) +{ key->conv_form = cform; if (key->group != NULL) EC_GROUP_set_point_conversion_form(key->group, cform); - } - -void *EC_KEY_get_key_method_data(EC_KEY *key, - void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)) - { +} + +void * +EC_KEY_get_key_method_data(EC_KEY *key, + void *(*dup_func) (void *), + void (*free_func) (void *), + void (*clear_free_func) (void *)) +{ void *ret; CRYPTO_r_lock(CRYPTO_LOCK_EC); @@ -499,11 +495,14 @@ void *EC_KEY_get_key_method_data(EC_KEY *key, CRYPTO_r_unlock(CRYPTO_LOCK_EC); return ret; - } - -void *EC_KEY_insert_key_method_data(EC_KEY *key, void *data, - void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)) - { +} + +void * +EC_KEY_insert_key_method_data(EC_KEY * key, void *data, + void *(*dup_func) (void *), + void (*free_func) (void *), + void (*clear_free_func) (void *)) +{ EC_EXTRA_DATA *ex_data; CRYPTO_w_lock(CRYPTO_LOCK_EC); @@ -513,32 +512,37 @@ void *EC_KEY_insert_key_method_data(EC_KEY *key, void *data, CRYPTO_w_unlock(CRYPTO_LOCK_EC); return ex_data; - } +} -void EC_KEY_set_asn1_flag(EC_KEY *key, int flag) - { +void +EC_KEY_set_asn1_flag(EC_KEY * key, int flag) +{ if (key->group != NULL) EC_GROUP_set_asn1_flag(key->group, flag); - } +} -int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx) - { +int +EC_KEY_precompute_mult(EC_KEY * key, BN_CTX * ctx) +{ if (key->group == NULL) return 0; return EC_GROUP_precompute_mult(key->group, ctx); - } +} -int EC_KEY_get_flags(const EC_KEY *key) - { +int +EC_KEY_get_flags(const EC_KEY * key) +{ return key->flags; - } +} -void EC_KEY_set_flags(EC_KEY *key, int flags) - { +void +EC_KEY_set_flags(EC_KEY * key, int flags) +{ key->flags |= flags; - } +} -void EC_KEY_clear_flags(EC_KEY *key, int flags) - { +void +EC_KEY_clear_flags(EC_KEY * key, int flags) +{ key->flags &= ~flags; - } +} |