diff options
| author | tedu <> | 2015-03-19 14:00:22 +0000 |
|---|---|---|
| committer | tedu <> | 2015-03-19 14:00:22 +0000 |
| commit | 985dda77b7930c0837c4acb74b7bd23252f849c1 (patch) | |
| tree | e1849327a9d18d917e7698c775d31f7ae7c4e34f /src/lib/libcrypto/ec | |
| parent | 6b3d8d3164d1b68d078a0cf83583f3dd8bbcb340 (diff) | |
| download | openbsd-985dda77b7930c0837c4acb74b7bd23252f849c1.tar.gz openbsd-985dda77b7930c0837c4acb74b7bd23252f849c1.tar.bz2 openbsd-985dda77b7930c0837c4acb74b7bd23252f849c1.zip | |
Fix several crash causing defects from OpenSSL.
These include:
CVE-2015-0209 - Use After Free following d2i_ECPrivatekey error
CVE-2015-0286 - Segmentation fault in ASN1_TYPE_cmp
CVE-2015-0287 - ASN.1 structure reuse memory corruption
CVE-2015-0289 - PKCS7 NULL pointer dereferences
Several other issues did not apply or were already fixed.
Refer to https://www.openssl.org/news/secadv_20150319.txt
joint work with beck, doug, guenther, jsing, miod
Diffstat (limited to 'src/lib/libcrypto/ec')
| -rw-r--r-- | src/lib/libcrypto/ec/ec_asn1.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/src/lib/libcrypto/ec/ec_asn1.c b/src/lib/libcrypto/ec/ec_asn1.c index c0ef6f40e4..f01008ec43 100644 --- a/src/lib/libcrypto/ec/ec_asn1.c +++ b/src/lib/libcrypto/ec/ec_asn1.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ec_asn1.c,v 1.12 2015/02/10 05:43:09 jsing Exp $ */ | 1 | /* $OpenBSD: ec_asn1.c,v 1.13 2015/03/19 14:00:22 tedu Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Written by Nils Larsch for the OpenSSL project. | 3 | * Written by Nils Larsch for the OpenSSL project. |
| 4 | */ | 4 | */ |
| @@ -999,19 +999,19 @@ d2i_ECPKParameters(EC_GROUP ** a, const unsigned char **in, long len) | |||
| 999 | 999 | ||
| 1000 | if ((params = d2i_ECPKPARAMETERS(NULL, in, len)) == NULL) { | 1000 | if ((params = d2i_ECPKPARAMETERS(NULL, in, len)) == NULL) { |
| 1001 | ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_D2I_ECPKPARAMETERS_FAILURE); | 1001 | ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_D2I_ECPKPARAMETERS_FAILURE); |
| 1002 | ECPKPARAMETERS_free(params); | 1002 | goto err; |
| 1003 | return NULL; | ||
| 1004 | } | 1003 | } |
| 1005 | if ((group = ec_asn1_pkparameters2group(params)) == NULL) { | 1004 | if ((group = ec_asn1_pkparameters2group(params)) == NULL) { |
| 1006 | ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_PKPARAMETERS2GROUP_FAILURE); | 1005 | ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_PKPARAMETERS2GROUP_FAILURE); |
| 1007 | ECPKPARAMETERS_free(params); | 1006 | goto err; |
| 1008 | return NULL; | ||
| 1009 | } | 1007 | } |
| 1010 | if (a && *a) | 1008 | |
| 1009 | if (a != NULL) { | ||
| 1011 | EC_GROUP_clear_free(*a); | 1010 | EC_GROUP_clear_free(*a); |
| 1012 | if (a) | ||
| 1013 | *a = group; | 1011 | *a = group; |
| 1012 | } | ||
| 1014 | 1013 | ||
| 1014 | err: | ||
| 1015 | ECPKPARAMETERS_free(params); | 1015 | ECPKPARAMETERS_free(params); |
| 1016 | return (group); | 1016 | return (group); |
| 1017 | } | 1017 | } |
| @@ -1039,7 +1039,6 @@ i2d_ECPKParameters(const EC_GROUP * a, unsigned char **out) | |||
| 1039 | EC_KEY * | 1039 | EC_KEY * |
| 1040 | d2i_ECPrivateKey(EC_KEY ** a, const unsigned char **in, long len) | 1040 | d2i_ECPrivateKey(EC_KEY ** a, const unsigned char **in, long len) |
| 1041 | { | 1041 | { |
| 1042 | int ok = 0; | ||
| 1043 | EC_KEY *ret = NULL; | 1042 | EC_KEY *ret = NULL; |
| 1044 | EC_PRIVATEKEY *priv_key = NULL; | 1043 | EC_PRIVATEKEY *priv_key = NULL; |
| 1045 | 1044 | ||
| @@ -1054,12 +1053,9 @@ d2i_ECPrivateKey(EC_KEY ** a, const unsigned char **in, long len) | |||
| 1054 | } | 1053 | } |
| 1055 | if (a == NULL || *a == NULL) { | 1054 | if (a == NULL || *a == NULL) { |
| 1056 | if ((ret = EC_KEY_new()) == NULL) { | 1055 | if ((ret = EC_KEY_new()) == NULL) { |
| 1057 | ECerr(EC_F_D2I_ECPRIVATEKEY, | 1056 | ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_MALLOC_FAILURE); |
| 1058 | ERR_R_MALLOC_FAILURE); | ||
| 1059 | goto err; | 1057 | goto err; |
| 1060 | } | 1058 | } |
| 1061 | if (a) | ||
| 1062 | *a = ret; | ||
| 1063 | } else | 1059 | } else |
| 1064 | ret = *a; | 1060 | ret = *a; |
| 1065 | 1061 | ||
| @@ -1109,17 +1105,19 @@ d2i_ECPrivateKey(EC_KEY ** a, const unsigned char **in, long len) | |||
| 1109 | goto err; | 1105 | goto err; |
| 1110 | } | 1106 | } |
| 1111 | } | 1107 | } |
| 1112 | ok = 1; | 1108 | |
| 1109 | EC_PRIVATEKEY_free(priv_key); | ||
| 1110 | if (a != NULL) | ||
| 1111 | *a = ret; | ||
| 1112 | return (ret); | ||
| 1113 | |||
| 1113 | err: | 1114 | err: |
| 1114 | if (!ok) { | 1115 | if (a == NULL || *a != ret) |
| 1115 | if (ret) | 1116 | EC_KEY_free(ret); |
| 1116 | EC_KEY_free(ret); | ||
| 1117 | ret = NULL; | ||
| 1118 | } | ||
| 1119 | if (priv_key) | 1117 | if (priv_key) |
| 1120 | EC_PRIVATEKEY_free(priv_key); | 1118 | EC_PRIVATEKEY_free(priv_key); |
| 1121 | 1119 | ||
| 1122 | return (ret); | 1120 | return (NULL); |
| 1123 | } | 1121 | } |
| 1124 | 1122 | ||
| 1125 | int | 1123 | int |
| @@ -1232,8 +1230,6 @@ d2i_ECParameters(EC_KEY ** a, const unsigned char **in, long len) | |||
| 1232 | ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_MALLOC_FAILURE); | 1230 | ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_MALLOC_FAILURE); |
| 1233 | return NULL; | 1231 | return NULL; |
| 1234 | } | 1232 | } |
| 1235 | if (a) | ||
| 1236 | *a = ret; | ||
| 1237 | } else | 1233 | } else |
| 1238 | ret = *a; | 1234 | ret = *a; |
| 1239 | 1235 | ||
| @@ -1241,6 +1237,9 @@ d2i_ECParameters(EC_KEY ** a, const unsigned char **in, long len) | |||
| 1241 | ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_EC_LIB); | 1237 | ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_EC_LIB); |
| 1242 | return NULL; | 1238 | return NULL; |
| 1243 | } | 1239 | } |
| 1240 | |||
| 1241 | if (a != NULL) | ||
| 1242 | *a = ret; | ||
| 1244 | return ret; | 1243 | return ret; |
| 1245 | } | 1244 | } |
| 1246 | 1245 | ||
