diff options
author | Joseph Sutton <josephsutton@catalyst.net.nz> | 2023-03-09 09:00:02 +1300 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2023-03-31 01:48:30 +0000 |
commit | a87aae5292d1c43b987dcfa77a51b6aa5aa3e004 (patch) | |
tree | c1af6a7ddb6a196d4af09cd086815be51a709365 /third_party/heimdal/lib/hx509/crypto.c | |
parent | f448a1649cf4af11f1ceba55ec62e9b2a3db24f1 (diff) | |
download | samba-a87aae5292d1c43b987dcfa77a51b6aa5aa3e004.tar.gz |
third_party/heimdal: Import lorikeet-heimdal-202303200103 (commit 2ee541b5e963f7cffb1ec4acd1a8cc45426a9f28)
NOTE: THIS COMMIT WON'T COMPILE/WORK ON ITS OWN!
Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'third_party/heimdal/lib/hx509/crypto.c')
-rw-r--r-- | third_party/heimdal/lib/hx509/crypto.c | 46 |
1 files changed, 21 insertions, 25 deletions
diff --git a/third_party/heimdal/lib/hx509/crypto.c b/third_party/heimdal/lib/hx509/crypto.c index 8d368ed9c4d..05f694b41c5 100644 --- a/third_party/heimdal/lib/hx509/crypto.c +++ b/third_party/heimdal/lib/hx509/crypto.c @@ -1304,10 +1304,27 @@ hx509_parse_private_key(hx509_context context, *private_key = NULL; - if (format == HX509_KEY_FORMAT_PKCS8) { + ops = hx509_find_private_alg(&keyai->algorithm); + if (ops == NULL) { + hx509_clear_error_string(context); + return HX509_SIG_ALG_NO_SUPPORTED; + } + + ret = hx509_private_key_init(private_key, ops, NULL); + if (ret) { + hx509_set_error_string(context, 0, ret, "out of memory"); + return ret; + } + + ret = (*ops->import)(context, keyai, data, len, format, *private_key); + if (ret) + hx509_private_key_free(private_key); + + if (ret && format == HX509_KEY_FORMAT_PKCS8) { PKCS8PrivateKeyInfo ki; hx509_private_key key; + /* Re-enter to try parsing the DER-encoded key from PKCS#8 envelope */ ret = decode_PKCS8PrivateKeyInfo(data, len, &ki, NULL); if (ret) { hx509_set_error_string(context, 0, HX509_PARSING_KEY_FAILED, @@ -1315,39 +1332,18 @@ hx509_parse_private_key(hx509_context context, "key"); return HX509_PARSING_KEY_FAILED; } - - /* Re-enter to parse DER-encoded key from PKCS#8 envelope */ ret = hx509_parse_private_key(context, &ki.privateKeyAlgorithm, ki.privateKey.data, ki.privateKey.length, HX509_KEY_FORMAT_DER, &key); free_PKCS8PrivateKeyInfo(&ki); if (ret) { - hx509_set_error_string(context, 0, HX509_PARSING_KEY_FAILED, - "Failed to parse RSA key from PKCS#8 " + hx509_set_error_string(context, 0, HX509_PARSING_KEY_FAILED, + "Failed to parse RSA key from PKCS#8 " "envelope"); - return HX509_PARSING_KEY_FAILED; + return HX509_PARSING_KEY_FAILED; } - *private_key = key; - return ret; - } - - ops = hx509_find_private_alg(&keyai->algorithm); - if (ops == NULL) { - hx509_clear_error_string(context); - return HX509_SIG_ALG_NO_SUPPORTED; } - - ret = hx509_private_key_init(private_key, ops, NULL); - if (ret) { - hx509_set_error_string(context, 0, ret, "out of memory"); - return ret; - } - - ret = (*ops->import)(context, keyai, data, len, format, *private_key); - if (ret) - hx509_private_key_free(private_key); - return ret; } |