diff options
| author | jsing <> | 2023-03-08 05:45:31 +0000 |
|---|---|---|
| committer | jsing <> | 2023-03-08 05:45:31 +0000 |
| commit | 948c28a26f1877b33103e7640006ebcd45dd4375 (patch) | |
| tree | 96a3d2dbc6ef11df6851b53d3d2e1c46dd7f2328 /src/lib/libcrypto/ec/ec_lib.c | |
| parent | 442f7bc80303382d3992bb55ef733a468c1662f2 (diff) | |
| download | openbsd-948c28a26f1877b33103e7640006ebcd45dd4375.tar.gz openbsd-948c28a26f1877b33103e7640006ebcd45dd4375.tar.bz2 openbsd-948c28a26f1877b33103e7640006ebcd45dd4375.zip | |
Always clear EC groups and points on free.
Rather than sometimes clearing, turn the free functions into ones that
always clear (as we've done elsewhere). Turn the EC_GROUP_clear_free() and
EC_POINT_clear_free() functions into wrappers that call the *_free()
version. Do similar for the EC_METHOD implementations, removing the
group_clear_finish() and point_clear_finish() hooks in the process.
ok tb@
Diffstat (limited to 'src/lib/libcrypto/ec/ec_lib.c')
| -rw-r--r-- | src/lib/libcrypto/ec/ec_lib.c | 53 |
1 files changed, 13 insertions, 40 deletions
diff --git a/src/lib/libcrypto/ec/ec_lib.c b/src/lib/libcrypto/ec/ec_lib.c index 0e863ddfef..8eb0253a1f 100644 --- a/src/lib/libcrypto/ec/ec_lib.c +++ b/src/lib/libcrypto/ec/ec_lib.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ec_lib.c,v 1.49 2023/03/07 09:27:10 jsing Exp $ */ | 1 | /* $OpenBSD: ec_lib.c,v 1.50 2023/03/08 05:45:31 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Originally written by Bodo Moeller for the OpenSSL project. | 3 | * Originally written by Bodo Moeller for the OpenSSL project. |
| 4 | */ | 4 | */ |
| @@ -117,46 +117,28 @@ EC_GROUP_new(const EC_METHOD *meth) | |||
| 117 | void | 117 | void |
| 118 | EC_GROUP_free(EC_GROUP *group) | 118 | EC_GROUP_free(EC_GROUP *group) |
| 119 | { | 119 | { |
| 120 | if (!group) | 120 | if (group != NULL) |
| 121 | return; | 121 | return; |
| 122 | 122 | ||
| 123 | if (group->meth->group_finish != 0) | 123 | if (group->meth->group_finish != NULL) |
| 124 | group->meth->group_finish(group); | 124 | group->meth->group_finish(group); |
| 125 | 125 | ||
| 126 | EC_EX_DATA_free_all_data(&group->extra_data); | 126 | EC_EX_DATA_clear_free_all_data(&group->extra_data); |
| 127 | 127 | ||
| 128 | EC_POINT_free(group->generator); | 128 | EC_POINT_free(group->generator); |
| 129 | BN_free(&group->order); | 129 | BN_free(&group->order); |
| 130 | BN_free(&group->cofactor); | 130 | BN_free(&group->cofactor); |
| 131 | 131 | ||
| 132 | free(group->seed); | 132 | freezero(group->seed, group->seed_len); |
| 133 | 133 | freezero(group, sizeof *group); | |
| 134 | free(group); | ||
| 135 | } | 134 | } |
| 136 | 135 | ||
| 137 | |||
| 138 | void | 136 | void |
| 139 | EC_GROUP_clear_free(EC_GROUP *group) | 137 | EC_GROUP_clear_free(EC_GROUP *group) |
| 140 | { | 138 | { |
| 141 | if (!group) | 139 | return EC_GROUP_free(group); |
| 142 | return; | ||
| 143 | |||
| 144 | if (group->meth->group_clear_finish != 0) | ||
| 145 | group->meth->group_clear_finish(group); | ||
| 146 | else if (group->meth->group_finish != 0) | ||
| 147 | group->meth->group_finish(group); | ||
| 148 | |||
| 149 | EC_EX_DATA_clear_free_all_data(&group->extra_data); | ||
| 150 | |||
| 151 | EC_POINT_clear_free(group->generator); | ||
| 152 | BN_free(&group->order); | ||
| 153 | BN_free(&group->cofactor); | ||
| 154 | |||
| 155 | freezero(group->seed, group->seed_len); | ||
| 156 | freezero(group, sizeof *group); | ||
| 157 | } | 140 | } |
| 158 | 141 | ||
| 159 | |||
| 160 | int | 142 | int |
| 161 | EC_GROUP_copy(EC_GROUP *dest, const EC_GROUP *src) | 143 | EC_GROUP_copy(EC_GROUP *dest, const EC_GROUP *src) |
| 162 | { | 144 | { |
| @@ -195,7 +177,7 @@ EC_GROUP_copy(EC_GROUP *dest, const EC_GROUP *src) | |||
| 195 | return 0; | 177 | return 0; |
| 196 | } else { | 178 | } else { |
| 197 | /* src->generator == NULL */ | 179 | /* src->generator == NULL */ |
| 198 | EC_POINT_clear_free(dest->generator); | 180 | EC_POINT_free(dest->generator); |
| 199 | dest->generator = NULL; | 181 | dest->generator = NULL; |
| 200 | } | 182 | } |
| 201 | 183 | ||
| @@ -851,33 +833,24 @@ EC_POINT_new(const EC_GROUP *group) | |||
| 851 | return ret; | 833 | return ret; |
| 852 | } | 834 | } |
| 853 | 835 | ||
| 854 | |||
| 855 | void | 836 | void |
| 856 | EC_POINT_free(EC_POINT *point) | 837 | EC_POINT_free(EC_POINT *point) |
| 857 | { | 838 | { |
| 858 | if (!point) | 839 | if (point != NULL) |
| 859 | return; | 840 | return; |
| 860 | 841 | ||
| 861 | if (point->meth->point_finish != 0) | 842 | if (point->meth->point_finish != NULL) |
| 862 | point->meth->point_finish(point); | 843 | point->meth->point_finish(point); |
| 863 | free(point); | ||
| 864 | } | ||
| 865 | 844 | ||
| 845 | freezero(point, sizeof *point); | ||
| 846 | } | ||
| 866 | 847 | ||
| 867 | void | 848 | void |
| 868 | EC_POINT_clear_free(EC_POINT *point) | 849 | EC_POINT_clear_free(EC_POINT *point) |
| 869 | { | 850 | { |
| 870 | if (!point) | 851 | return EC_POINT_free(point); |
| 871 | return; | ||
| 872 | |||
| 873 | if (point->meth->point_clear_finish != 0) | ||
| 874 | point->meth->point_clear_finish(point); | ||
| 875 | else if (point->meth->point_finish != 0) | ||
| 876 | point->meth->point_finish(point); | ||
| 877 | freezero(point, sizeof *point); | ||
| 878 | } | 852 | } |
| 879 | 853 | ||
| 880 | |||
| 881 | int | 854 | int |
| 882 | EC_POINT_copy(EC_POINT *dest, const EC_POINT *src) | 855 | EC_POINT_copy(EC_POINT *dest, const EC_POINT *src) |
| 883 | { | 856 | { |
