diff options
| author | tb <> | 2023-12-16 14:04:59 +0000 |
|---|---|---|
| committer | tb <> | 2023-12-16 14:04:59 +0000 |
| commit | 5ce845a747576167513424c2bbb31b19800e20a0 (patch) | |
| tree | 66210f30b3273d815e80ab90cc41aa76c92c9711 /src | |
| parent | 491099a31662fdc2c0700f41ee8b9099e2dbbe8c (diff) | |
| download | openbsd-5ce845a747576167513424c2bbb31b19800e20a0.tar.gz openbsd-5ce845a747576167513424c2bbb31b19800e20a0.tar.bz2 openbsd-5ce845a747576167513424c2bbb31b19800e20a0.zip | |
Remove OBJ_bsearch_() usage from PBE
Split the table of built-in password based encryption algorithms into two
and use a linear scan over the table corresponding to the type specified
in EVP_PBE_find()'s type argument. Use better variable names, make the
API a bit safer and generally reduce the eye bleed in here.
ok jsing
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/evp/evp_pbe.c | 254 |
1 files changed, 175 insertions, 79 deletions
diff --git a/src/lib/libcrypto/evp/evp_pbe.c b/src/lib/libcrypto/evp/evp_pbe.c index edcd385341..0fe82953e3 100644 --- a/src/lib/libcrypto/evp/evp_pbe.c +++ b/src/lib/libcrypto/evp/evp_pbe.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: evp_pbe.c,v 1.31 2023/12/15 14:21:14 tb Exp $ */ | 1 | /* $OpenBSD: evp_pbe.c,v 1.32 2023/12/16 14:04:59 tb Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 1999. | 3 | * project 1999. |
| 4 | */ | 4 | */ |
| @@ -70,49 +70,156 @@ | |||
| 70 | 70 | ||
| 71 | /* Password based encryption (PBE) functions */ | 71 | /* Password based encryption (PBE) functions */ |
| 72 | 72 | ||
| 73 | typedef struct { | 73 | struct pbe_config { |
| 74 | int pbe_type; | ||
| 75 | int pbe_nid; | 74 | int pbe_nid; |
| 76 | int cipher_nid; | 75 | int cipher_nid; |
| 77 | int md_nid; | 76 | int md_nid; |
| 78 | EVP_PBE_KEYGEN *keygen; | 77 | EVP_PBE_KEYGEN *keygen; |
| 79 | } EVP_PBE_CTL; | 78 | }; |
| 80 | |||
| 81 | static const EVP_PBE_CTL builtin_pbe[] = { | ||
| 82 | {EVP_PBE_TYPE_OUTER, NID_pbeWithMD2AndDES_CBC, NID_des_cbc, NID_md2, PKCS5_PBE_keyivgen}, | ||
| 83 | {EVP_PBE_TYPE_OUTER, NID_pbeWithMD5AndDES_CBC, NID_des_cbc, NID_md5, PKCS5_PBE_keyivgen}, | ||
| 84 | {EVP_PBE_TYPE_OUTER, NID_pbeWithSHA1AndRC2_CBC, NID_rc2_64_cbc, NID_sha1, PKCS5_PBE_keyivgen}, | ||
| 85 | 79 | ||
| 80 | static const struct pbe_config pbe_outer[] = { | ||
| 81 | { | ||
| 82 | .pbe_nid = NID_pbeWithMD2AndDES_CBC, | ||
| 83 | .cipher_nid = NID_des_cbc, | ||
| 84 | .md_nid = NID_md2, | ||
| 85 | .keygen = PKCS5_PBE_keyivgen, | ||
| 86 | }, | ||
| 87 | { | ||
| 88 | .pbe_nid = NID_pbeWithMD5AndDES_CBC, | ||
| 89 | .cipher_nid = NID_des_cbc, | ||
| 90 | .md_nid = NID_md5, | ||
| 91 | .keygen = PKCS5_PBE_keyivgen, | ||
| 92 | }, | ||
| 93 | { | ||
| 94 | .pbe_nid = NID_pbeWithSHA1AndRC2_CBC, | ||
| 95 | .cipher_nid = NID_rc2_64_cbc, | ||
| 96 | .md_nid = NID_sha1, | ||
| 97 | .keygen = PKCS5_PBE_keyivgen, | ||
| 98 | }, | ||
| 86 | #ifndef OPENSSL_NO_HMAC | 99 | #ifndef OPENSSL_NO_HMAC |
| 87 | {EVP_PBE_TYPE_OUTER, NID_id_pbkdf2, -1, -1, PKCS5_v2_PBKDF2_keyivgen}, | 100 | { |
| 101 | .pbe_nid = NID_id_pbkdf2, | ||
| 102 | .cipher_nid = -1, | ||
| 103 | .md_nid = -1, | ||
| 104 | .keygen = PKCS5_v2_PBKDF2_keyivgen, | ||
| 105 | }, | ||
| 88 | #endif | 106 | #endif |
| 89 | 107 | { | |
| 90 | {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And128BitRC4, NID_rc4, NID_sha1, PKCS12_PBE_keyivgen}, | 108 | .pbe_nid = NID_pbe_WithSHA1And128BitRC4, |
| 91 | {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And40BitRC4, NID_rc4_40, NID_sha1, PKCS12_PBE_keyivgen}, | 109 | .cipher_nid = NID_rc4, |
| 92 | {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And3_Key_TripleDES_CBC, NID_des_ede3_cbc, NID_sha1, PKCS12_PBE_keyivgen}, | 110 | .md_nid = NID_sha1, |
| 93 | {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And2_Key_TripleDES_CBC, NID_des_ede_cbc, NID_sha1, PKCS12_PBE_keyivgen}, | 111 | .keygen = PKCS12_PBE_keyivgen, |
| 94 | {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And128BitRC2_CBC, NID_rc2_cbc, NID_sha1, PKCS12_PBE_keyivgen}, | 112 | }, |
| 95 | {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And40BitRC2_CBC, NID_rc2_40_cbc, NID_sha1, PKCS12_PBE_keyivgen}, | 113 | { |
| 96 | 114 | .pbe_nid = NID_pbe_WithSHA1And40BitRC4, | |
| 115 | .cipher_nid = NID_rc4_40, | ||
| 116 | .md_nid = NID_sha1, | ||
| 117 | .keygen = PKCS12_PBE_keyivgen, | ||
| 118 | }, | ||
| 119 | { | ||
| 120 | .pbe_nid = NID_pbe_WithSHA1And3_Key_TripleDES_CBC, | ||
| 121 | .cipher_nid = NID_des_ede3_cbc, | ||
| 122 | .md_nid = NID_sha1, | ||
| 123 | .keygen = PKCS12_PBE_keyivgen, | ||
| 124 | }, | ||
| 125 | { | ||
| 126 | .pbe_nid = NID_pbe_WithSHA1And2_Key_TripleDES_CBC, | ||
| 127 | .cipher_nid = NID_des_ede_cbc, | ||
| 128 | .md_nid = NID_sha1, | ||
| 129 | .keygen = PKCS12_PBE_keyivgen, | ||
| 130 | }, | ||
| 131 | { | ||
| 132 | .pbe_nid = NID_pbe_WithSHA1And128BitRC2_CBC, | ||
| 133 | .cipher_nid = NID_rc2_cbc, | ||
| 134 | .md_nid = NID_sha1, | ||
| 135 | .keygen = PKCS12_PBE_keyivgen, | ||
| 136 | }, | ||
| 137 | { | ||
| 138 | .pbe_nid = NID_pbe_WithSHA1And40BitRC2_CBC, | ||
| 139 | .cipher_nid = NID_rc2_40_cbc, | ||
| 140 | .md_nid = NID_sha1, | ||
| 141 | .keygen = PKCS12_PBE_keyivgen, | ||
| 142 | }, | ||
| 97 | #ifndef OPENSSL_NO_HMAC | 143 | #ifndef OPENSSL_NO_HMAC |
| 98 | {EVP_PBE_TYPE_OUTER, NID_pbes2, -1, -1, PKCS5_v2_PBE_keyivgen}, | 144 | { |
| 145 | .pbe_nid = NID_pbes2, | ||
| 146 | .cipher_nid = -1, | ||
| 147 | .md_nid = -1, | ||
| 148 | .keygen = PKCS5_v2_PBE_keyivgen, | ||
| 149 | }, | ||
| 99 | #endif | 150 | #endif |
| 100 | {EVP_PBE_TYPE_OUTER, NID_pbeWithMD2AndRC2_CBC, NID_rc2_64_cbc, NID_md2, PKCS5_PBE_keyivgen}, | 151 | { |
| 101 | {EVP_PBE_TYPE_OUTER, NID_pbeWithMD5AndRC2_CBC, NID_rc2_64_cbc, NID_md5, PKCS5_PBE_keyivgen}, | 152 | .pbe_nid = NID_pbeWithMD2AndRC2_CBC, |
| 102 | {EVP_PBE_TYPE_OUTER, NID_pbeWithSHA1AndDES_CBC, NID_des_cbc, NID_sha1, PKCS5_PBE_keyivgen}, | 153 | .cipher_nid = NID_rc2_64_cbc, |
| 103 | 154 | .md_nid = NID_md2, | |
| 104 | 155 | .keygen = PKCS5_PBE_keyivgen, | |
| 105 | {EVP_PBE_TYPE_PRF, NID_hmacWithSHA1, -1, NID_sha1, 0}, | 156 | }, |
| 106 | {EVP_PBE_TYPE_PRF, NID_hmacWithMD5, -1, NID_md5, 0}, | 157 | { |
| 107 | {EVP_PBE_TYPE_PRF, NID_hmacWithSHA224, -1, NID_sha224, 0}, | 158 | .pbe_nid = NID_pbeWithMD5AndRC2_CBC, |
| 108 | {EVP_PBE_TYPE_PRF, NID_hmacWithSHA256, -1, NID_sha256, 0}, | 159 | .cipher_nid = NID_rc2_64_cbc, |
| 109 | {EVP_PBE_TYPE_PRF, NID_hmacWithSHA384, -1, NID_sha384, 0}, | 160 | .md_nid = NID_md5, |
| 110 | {EVP_PBE_TYPE_PRF, NID_hmacWithSHA512, -1, NID_sha512, 0}, | 161 | .keygen = PKCS5_PBE_keyivgen, |
| 111 | {EVP_PBE_TYPE_PRF, NID_id_HMACGostR3411_94, -1, NID_id_GostR3411_94, 0}, | 162 | }, |
| 112 | {EVP_PBE_TYPE_PRF, NID_id_tc26_hmac_gost_3411_12_256, -1, NID_id_tc26_gost3411_2012_256, 0}, | 163 | { |
| 113 | {EVP_PBE_TYPE_PRF, NID_id_tc26_hmac_gost_3411_12_512, -1, NID_id_tc26_gost3411_2012_512, 0}, | 164 | .pbe_nid = NID_pbeWithSHA1AndDES_CBC, |
| 165 | .cipher_nid = NID_des_cbc, | ||
| 166 | .md_nid = NID_sha1, | ||
| 167 | .keygen = PKCS5_PBE_keyivgen, | ||
| 168 | }, | ||
| 169 | }; | ||
| 170 | |||
| 171 | #define N_PBE_OUTER (sizeof(pbe_outer) / sizeof(pbe_outer[0])) | ||
| 172 | |||
| 173 | static const struct pbe_config pbe_prf[] = { | ||
| 174 | { | ||
| 175 | .pbe_nid = NID_hmacWithSHA1, | ||
| 176 | .cipher_nid = -1, | ||
| 177 | .md_nid = NID_sha1, | ||
| 178 | }, | ||
| 179 | { | ||
| 180 | .pbe_nid = NID_hmacWithMD5, | ||
| 181 | .cipher_nid = -1, | ||
| 182 | .md_nid = NID_md5, | ||
| 183 | }, | ||
| 184 | { | ||
| 185 | .pbe_nid = NID_hmacWithSHA224, | ||
| 186 | .cipher_nid = -1, | ||
| 187 | .md_nid = NID_sha224, | ||
| 188 | }, | ||
| 189 | { | ||
| 190 | .pbe_nid = NID_hmacWithSHA256, | ||
| 191 | .cipher_nid = -1, | ||
| 192 | .md_nid = NID_sha256, | ||
| 193 | }, | ||
| 194 | { | ||
| 195 | .pbe_nid = NID_hmacWithSHA384, | ||
| 196 | .cipher_nid = -1, | ||
| 197 | .md_nid = NID_sha384, | ||
| 198 | }, | ||
| 199 | { | ||
| 200 | .pbe_nid = NID_hmacWithSHA512, | ||
| 201 | .cipher_nid = -1, | ||
| 202 | .md_nid = NID_sha512, | ||
| 203 | }, | ||
| 204 | { | ||
| 205 | .pbe_nid = NID_id_HMACGostR3411_94, | ||
| 206 | .cipher_nid = -1, | ||
| 207 | .md_nid = NID_id_GostR3411_94, | ||
| 208 | }, | ||
| 209 | { | ||
| 210 | .pbe_nid = NID_id_tc26_hmac_gost_3411_12_256, | ||
| 211 | .cipher_nid = -1, | ||
| 212 | .md_nid = NID_id_tc26_gost3411_2012_256, | ||
| 213 | }, | ||
| 214 | { | ||
| 215 | .pbe_nid = NID_id_tc26_hmac_gost_3411_12_512, | ||
| 216 | .cipher_nid = -1, | ||
| 217 | .md_nid = NID_id_tc26_gost3411_2012_512, | ||
| 218 | }, | ||
| 114 | }; | 219 | }; |
| 115 | 220 | ||
| 221 | #define N_PBE_PRF (sizeof(pbe_prf) / sizeof(pbe_prf[0])) | ||
| 222 | |||
| 116 | int | 223 | int |
| 117 | EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, | 224 | EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, |
| 118 | ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de) | 225 | ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de) |
| @@ -166,59 +273,48 @@ EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, | |||
| 166 | return 1; | 273 | return 1; |
| 167 | } | 274 | } |
| 168 | 275 | ||
| 169 | static int pbe2_cmp_BSEARCH_CMP_FN(const void *, const void *); | ||
| 170 | static int pbe2_cmp(EVP_PBE_CTL const *, EVP_PBE_CTL const *); | ||
| 171 | static EVP_PBE_CTL *OBJ_bsearch_pbe2(EVP_PBE_CTL *key, EVP_PBE_CTL const *base, int num); | ||
| 172 | |||
| 173 | static int | ||
| 174 | pbe2_cmp(const EVP_PBE_CTL *pbe1, const EVP_PBE_CTL *pbe2) | ||
| 175 | { | ||
| 176 | int ret = pbe1->pbe_type - pbe2->pbe_type; | ||
| 177 | |||
| 178 | if (ret) | ||
| 179 | return ret; | ||
| 180 | else | ||
| 181 | return pbe1->pbe_nid - pbe2->pbe_nid; | ||
| 182 | } | ||
| 183 | |||
| 184 | |||
| 185 | static int | ||
| 186 | pbe2_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) | ||
| 187 | { | ||
| 188 | EVP_PBE_CTL const *a = a_; | ||
| 189 | EVP_PBE_CTL const *b = b_; | ||
| 190 | return pbe2_cmp(a, b); | ||
| 191 | } | ||
| 192 | |||
| 193 | static EVP_PBE_CTL * | ||
| 194 | OBJ_bsearch_pbe2(EVP_PBE_CTL *key, EVP_PBE_CTL const *base, int num) | ||
| 195 | { | ||
| 196 | return (EVP_PBE_CTL *)OBJ_bsearch_(key, base, num, sizeof(EVP_PBE_CTL), | ||
| 197 | pbe2_cmp_BSEARCH_CMP_FN); | ||
| 198 | } | ||
| 199 | |||
| 200 | int | 276 | int |
| 201 | EVP_PBE_find(int type, int pbe_nid, | 277 | EVP_PBE_find(int type, int pbe_nid, int *out_cipher_nid, int *out_md_nid, |
| 202 | int *pcnid, int *pmnid, EVP_PBE_KEYGEN **pkeygen) | 278 | EVP_PBE_KEYGEN **out_keygen) |
| 203 | { | 279 | { |
| 204 | EVP_PBE_CTL *pbetmp = NULL, pbelu; | 280 | const struct pbe_config *pbe = NULL; |
| 281 | size_t i; | ||
| 282 | |||
| 283 | if (out_cipher_nid != NULL) | ||
| 284 | *out_cipher_nid = NID_undef; | ||
| 285 | if (out_md_nid != NULL) | ||
| 286 | *out_md_nid = NID_undef; | ||
| 287 | if (out_keygen != NULL) | ||
| 288 | *out_keygen = NULL; | ||
| 205 | 289 | ||
| 206 | if (pbe_nid == NID_undef) | 290 | if (pbe_nid == NID_undef) |
| 207 | return 0; | 291 | return 0; |
| 208 | 292 | ||
| 209 | pbelu.pbe_type = type; | 293 | if (type == EVP_PBE_TYPE_OUTER) { |
| 210 | pbelu.pbe_nid = pbe_nid; | 294 | for (i = 0; i < N_PBE_OUTER; i++) { |
| 211 | 295 | if (pbe_nid == pbe_outer[i].pbe_nid) { | |
| 212 | pbetmp = OBJ_bsearch_pbe2(&pbelu, builtin_pbe, | 296 | pbe = &pbe_outer[i]; |
| 213 | sizeof(builtin_pbe)/sizeof(EVP_PBE_CTL)); | 297 | break; |
| 214 | if (pbetmp == NULL) | 298 | } |
| 299 | } | ||
| 300 | } else if (type == EVP_PBE_TYPE_PRF) { | ||
| 301 | for (i = 0; i < N_PBE_PRF; i++) { | ||
| 302 | if (pbe_nid == pbe_prf[i].pbe_nid) { | ||
| 303 | pbe = &pbe_prf[i]; | ||
| 304 | break; | ||
| 305 | } | ||
| 306 | } | ||
| 307 | } | ||
| 308 | if (pbe == NULL) | ||
| 215 | return 0; | 309 | return 0; |
| 216 | if (pcnid) | 310 | |
| 217 | *pcnid = pbetmp->cipher_nid; | 311 | if (out_cipher_nid != NULL) |
| 218 | if (pmnid) | 312 | *out_cipher_nid = pbe->cipher_nid; |
| 219 | *pmnid = pbetmp->md_nid; | 313 | if (out_md_nid != NULL) |
| 220 | if (pkeygen) | 314 | *out_md_nid = pbe->md_nid; |
| 221 | *pkeygen = pbetmp->keygen; | 315 | if (out_keygen != NULL) |
| 316 | *out_keygen = pbe->keygen; | ||
| 317 | |||
| 222 | return 1; | 318 | return 1; |
| 223 | } | 319 | } |
| 224 | 320 | ||
