changeset 26372:d0c3492bce55

lib-dcrypt: Only use compressed points with dovecot internal formats
author Aki Tuomi <aki.tuomi@open-xchange.com>
date Thu, 29 Aug 2019 17:09:55 +0300
parents 1d6ed0246396
children f962d5e2d1ce
files src/lib-dcrypt/dcrypt-openssl.c src/lib-dcrypt/test-crypto.c
diffstat 2 files changed, 27 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-dcrypt/dcrypt-openssl.c	Thu Aug 29 16:54:27 2019 +0300
+++ b/src/lib-dcrypt/dcrypt-openssl.c	Thu Aug 29 17:09:55 2019 +0300
@@ -695,8 +695,6 @@
 	EVP_PKEY_CTX_free(ctx);
 	EC_KEY_set_asn1_flag(EVP_PKEY_get0_EC_KEY((*key)),
 			     OPENSSL_EC_NAMED_CURVE);
-	EC_KEY_set_conv_form(EVP_PKEY_get0_EC_KEY((*key)),
-			     POINT_CONVERSION_COMPRESSED);
 	return TRUE;
 }
 
@@ -786,7 +784,6 @@
 	    EC_KEY_set_public_key(ec_key, pub) != 1)
 		ec = -1;
 	else
-		EC_KEY_set_conv_form(ec_key, POINT_CONVERSION_COMPRESSED);
 	EC_POINT_free(pub);
 	BN_CTX_free(bn_ctx);
 
@@ -851,10 +848,10 @@
 	BN_CTX *bn_ctx = BN_CTX_new();
 	const EC_POINT *pub = EC_KEY_get0_public_key(EVP_PKEY_get0_EC_KEY(local));
 	const EC_GROUP *grp = EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(local));
-	size_t len = EC_POINT_point2oct(grp, pub, POINT_CONVERSION_COMPRESSED,
+	size_t len = EC_POINT_point2oct(grp, pub, POINT_CONVERSION_UNCOMPRESSED,
 					NULL, 0, bn_ctx);
 	unsigned char R_buf[len];
-	EC_POINT_point2oct(grp, pub, POINT_CONVERSION_COMPRESSED,
+	EC_POINT_point2oct(grp, pub, POINT_CONVERSION_UNCOMPRESSED,
 			   R_buf, len, bn_ctx);
 	BN_CTX_free(bn_ctx);
 	buffer_append(R, R_buf, len);
@@ -1108,7 +1105,6 @@
 		EC_KEY_free(eckey);
 		return dcrypt_openssl_error(error_r);
 	}
-	EC_KEY_set_conv_form(eckey, POINT_CONVERSION_COMPRESSED);
 	EC_KEY_set_private_key(eckey, point);
 	EC_KEY_precompute_mult(eckey, bnctx);
 	EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE);
@@ -1400,7 +1396,6 @@
 			BN_CTX_free(bnctx);
 			return dcrypt_openssl_error(error_r);
 		}
-		EC_KEY_set_conv_form(eckey, POINT_CONVERSION_COMPRESSED);
 		EC_KEY_set_private_key(eckey, point);
 		EC_KEY_precompute_mult(eckey, bnctx);
 		EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE);
@@ -1597,7 +1592,6 @@
 
 	EC_KEY_precompute_mult(ec_key, NULL);
 	EC_KEY_set_asn1_flag(ec_key, OPENSSL_EC_NAMED_CURVE);
-	EC_KEY_set_conv_form(ec_key, POINT_CONVERSION_COMPRESSED);
 
 	/* return as EVP_PKEY */
 	EVP_PKEY *pkey = EVP_PKEY_new();
@@ -2268,6 +2262,8 @@
 		/* because otherwise we get wrong nid */
 		obj = OBJ_nid2obj(EC_GROUP_get_curve_name(
 			EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(pkey))));
+		EC_KEY_set_conv_form(EVP_PKEY_get0_EC_KEY(pkey),
+				     POINT_CONVERSION_COMPRESSED);
 
 	} else {
 		obj = OBJ_nid2obj(EVP_PKEY_id(pkey));
@@ -2360,6 +2356,9 @@
 	unsigned char *tmp = NULL;
 	size_t dest_used = buffer_get_used_size(destination);
 
+	if (EVP_PKEY_base_id(pubkey) == EVP_PKEY_EC)
+		EC_KEY_set_conv_form(EVP_PKEY_get0_EC_KEY(pubkey),
+				     POINT_CONVERSION_COMPRESSED);
 	int rv = i2d_PUBKEY(pubkey, &tmp);
 
 	if (tmp == NULL)
@@ -2430,8 +2429,8 @@
 	}
 
 	if (EVP_PKEY_base_id(key) == EVP_PKEY_EC) {
-		EC_KEY_set_conv_form(EVP_PKEY_get0_EC_KEY(key),
-				     POINT_CONVERSION_COMPRESSED);
+		EC_KEY_set_asn1_flag(EVP_PKEY_get0_EC_KEY(key),
+				     OPENSSL_EC_NAMED_CURVE);
 	}
 
 	*key_r = i_new(struct dcrypt_private_key, 1);
@@ -2495,7 +2494,6 @@
 		}
 		EC_KEY *eckey = d2i_EC_PUBKEY_bio(b64, NULL);
 		if (eckey != NULL) {
-			EC_KEY_set_conv_form(eckey, POINT_CONVERSION_COMPRESSED);
 			EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE);
 			key = EVP_PKEY_new();
 			if (key != NULL)
@@ -2544,6 +2542,10 @@
 		return ret;
 	}
 
+	if (EVP_PKEY_base_id(pkey) == EVP_PKEY_EC)
+		EC_KEY_set_conv_form(EVP_PKEY_get0_EC_KEY(pkey),
+				     POINT_CONVERSION_UNCOMPRESSED);
+
 	BIO *key_out = BIO_new(BIO_s_mem());
 	if (key_out == NULL)
 		return dcrypt_openssl_error(error_r);
@@ -2604,6 +2606,10 @@
 		return ret;
 	}
 
+	if (EVP_PKEY_base_id(pkey) == EVP_PKEY_EC)
+		EC_KEY_set_conv_form(EVP_PKEY_get0_EC_KEY(pkey),
+				     POINT_CONVERSION_UNCOMPRESSED);
+
 	BIO *key_out = BIO_new(BIO_s_mem());
 	if (key_out == NULL)
 		return dcrypt_openssl_error(error_r);
@@ -3251,6 +3257,7 @@
 	} else if (EVP_PKEY_base_id(priv) == EVP_PKEY_EC) {
 		/* store OID */
 		EC_KEY *key = EVP_PKEY_get0_EC_KEY(priv);
+		EC_KEY_set_conv_form(key, POINT_CONVERSION_UNCOMPRESSED);
 		int nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(key));
 		ASN1_OBJECT *obj = OBJ_nid2obj(nid);
 		int len = OBJ_length(obj);
@@ -3304,6 +3311,7 @@
 	} else if (EVP_PKEY_base_id(pub) == EVP_PKEY_EC) {
 		/* store OID */
 		EC_KEY *key = EVP_PKEY_get0_EC_KEY(pub);
+		EC_KEY_set_conv_form(key, POINT_CONVERSION_UNCOMPRESSED);
 		int nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(key));
 		ASN1_OBJECT *obj = OBJ_nid2obj(nid);
 		int len = OBJ_length(obj);
@@ -3411,7 +3419,6 @@
 			return dcrypt_openssl_error(error_r);
 		}
 		EC_KEY_set_asn1_flag(key, OPENSSL_EC_NAMED_CURVE);
-		EC_KEY_set_conv_form(key, POINT_CONVERSION_COMPRESSED);
 
 		EVP_PKEY *pkey = EVP_PKEY_new();
 		EVP_PKEY_set1_EC_KEY(pkey, key);
@@ -3490,7 +3497,6 @@
 
 		EC_KEY_precompute_mult(key, NULL);
 		EC_KEY_set_asn1_flag(key, OPENSSL_EC_NAMED_CURVE);
-		EC_KEY_set_conv_form(key, POINT_CONVERSION_COMPRESSED);
 		EVP_PKEY *pkey = EVP_PKEY_new();
 		EVP_PKEY_set1_EC_KEY(pkey, key);
 		EC_KEY_free(key);
--- a/src/lib-dcrypt/test-crypto.c	Thu Aug 29 16:54:27 2019 +0300
+++ b/src/lib-dcrypt/test-crypto.c	Thu Aug 29 17:09:55 2019 +0300
@@ -453,11 +453,12 @@
 {
 	const char *keys[] = {
 		"-----BEGIN PRIVATE KEY-----\n"
-		"MGcCAQAwEwYHKoZIzj0CAQYIKoZIzj0D"
-			"AQcETTBLAgEBBCC25AkD65uhlZXCAdwN\n"
-		"yLJV2ui8A/CUyqyEMrezvwgMO6EkAyIA"
-			"AybRUR3MsH0+0PQcDwkrXOJ9aePwzTQV\n"
-		"DN51+n1JCxbI\n"
+		"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgtu"
+		"QJA+uboZWVwgHc\n"
+		"DciyVdrovAPwlMqshDK3s78IDDuhRANCAAQm0VEdzLB9PtD0HA"
+		"8JK1zifWnj8M00\n"
+		"FQzedfp9SQsWyA8dzs5/NFR5MTe6Xbh/ndKEs1zZH3vZ4FlNri"
+		"lZc0st\n"
 		"-----END PRIVATE KEY-----\n",
 		"2:1.2.840.10045.3.1.7:0:0000002100b6e40903eb9ba195"
 		"95c201dc0dc8b255dae8bc03f094caac8432b7b3bf080c3b:a"
@@ -1155,10 +1156,9 @@
 	/* Acquired using another tool */
 	const char *pem_key =
 	  "-----BEGIN PUBLIC KEY-----\n"
-	  "MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgACKp0Y4+Wpt+D9t/2XenFIj0LmvaZB\n"
-	  "yLG69yOisek4aMI=\n"
+	  "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKp0Y4+Wpt+D9t/2XenFIj0LmvaZB\n"
+	  "yLG69yOisek4aMLCMQ8HkGEflJE/DVwI3mCtassKmGtbX18IVHyntz07mg==\n"
 	  "-----END PUBLIC KEY-----";
-
 	test_begin("test_jwk_keys");
 	struct dcrypt_keypair pair;
 	buffer_t *pem = t_buffer_create(256);