aboutsummaryrefslogtreecommitdiffstats
path: root/lib/crypto/c_src/ec.c
diff options
context:
space:
mode:
authorDoug Hogan <[email protected]>2019-01-04 00:50:27 -0800
committerDoug Hogan <[email protected]>2019-01-08 01:11:58 -0800
commit3838f0a85cb0fd299dd2460673b64cd4e319b387 (patch)
tree3b69662404d7e390550e3fffb7d20a3e0c4c6a63 /lib/crypto/c_src/ec.c
parente4ecb3fd94ebae8eac89dbfb9376d78a5ac9a508 (diff)
downloadotp-3838f0a85cb0fd299dd2460673b64cd4e319b387.tar.gz
otp-3838f0a85cb0fd299dd2460673b64cd4e319b387.tar.bz2
otp-3838f0a85cb0fd299dd2460673b64cd4e319b387.zip
Revamp get_ec_key()
Diffstat (limited to 'lib/crypto/c_src/ec.c')
-rw-r--r--lib/crypto/c_src/ec.c86
1 files changed, 46 insertions, 40 deletions
diff --git a/lib/crypto/c_src/ec.c b/lib/crypto/c_src/ec.c
index 4fb9229edb..78bdee318c 100644
--- a/lib/crypto/c_src/ec.c
+++ b/lib/crypto/c_src/ec.c
@@ -302,58 +302,64 @@ int get_ec_key(ErlNifEnv* env,
EC_POINT *pub_key = NULL;
EC_GROUP *group = NULL;
- if (!(priv == atom_undefined || get_bn_from_bin(env, priv, &priv_key))
- || !(pub == atom_undefined || enif_is_binary(env, pub))) {
- goto out_err;
+ if (priv != atom_undefined) {
+ if (!get_bn_from_bin(env, priv, &priv_key))
+ goto err;
}
-
- key = ec_key_new(env, curve);
-
- if (!key) {
- goto out_err;
+ if (pub != atom_undefined) {
+ if (!enif_is_binary(env, pub))
+ goto err;
}
- if (!group)
- group = EC_GROUP_dup(EC_KEY_get0_group(key));
+ if ((key = ec_key_new(env, curve)) == NULL)
+ goto err;
+
+ if ((group = EC_GROUP_dup(EC_KEY_get0_group(key))) == NULL)
+ goto err;
if (term2point(env, pub, group, &pub_key)) {
- if (!EC_KEY_set_public_key(key, pub_key)) {
- goto out_err;
- }
- }
- if (priv != atom_undefined
- && !BN_is_zero(priv_key)) {
- if (!EC_KEY_set_private_key(key, priv_key))
- goto out_err;
-
- /* calculate public key (if necessary) */
- if (EC_KEY_get0_public_key(key) == NULL)
- {
- /* the public key was not included in the SEC1 private
- * key => calculate the public key */
- pub_key = EC_POINT_new(group);
- if (pub_key == NULL
- || !EC_POINT_copy(pub_key, EC_GROUP_get0_generator(group))
- || !EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, NULL)
- || !EC_KEY_set_public_key(key, pub_key))
- goto out_err;
- }
+ if (!EC_KEY_set_public_key(key, pub_key))
+ goto err;
}
- goto out;
+ if (priv != atom_undefined && !BN_is_zero(priv_key)) {
+ if (!EC_KEY_set_private_key(key, priv_key))
+ goto err;
-out_err:
- if (key) EC_KEY_free(key);
+ /* calculate public key (if necessary) */
+ if (EC_KEY_get0_public_key(key) == NULL) {
+ /* the public key was not included in the SEC1 private
+ * key => calculate the public key */
+ if ((pub_key = EC_POINT_new(group)) == NULL)
+ goto err;
+ if (!EC_POINT_copy(pub_key, EC_GROUP_get0_generator(group)))
+ goto err;
+ if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, NULL))
+ goto err;
+ if (!EC_KEY_set_public_key(key, pub_key))
+ goto err;
+ }
+ }
+ goto done;
+
+ err:
+ if (key)
+ EC_KEY_free(key);
key = NULL;
-out:
+ done:
/* some OpenSSL structures are mem-dup'ed into the key,
so we have to free our copies here */
- if (priv_key) BN_clear_free(priv_key);
- if (pub_key) EC_POINT_free(pub_key);
- if (group) EC_GROUP_free(group);
- if (!key)
- return 0;
+ if (priv_key)
+ BN_clear_free(priv_key);
+ if (group)
+ EC_GROUP_free(group);
+ if (pub_key)
+ EC_POINT_free(pub_key);
+
+ if (key == NULL)
+ return 0;
+
*res = key;
return 1;
}