summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/public_key/src/public_key.erl17
-rw-r--r--lib/public_key/test/public_key_SUITE.erl39
2 files changed, 44 insertions, 12 deletions
diff --git a/lib/public_key/src/public_key.erl b/lib/public_key/src/public_key.erl
index 597aca35d5..8c8b5585a0 100644
--- a/lib/public_key/src/public_key.erl
+++ b/lib/public_key/src/public_key.erl
@@ -992,10 +992,19 @@ pkix_path_validation(TrustedCert, CertChain, Options)
pkix_path_validation(#'OTPCertificate'{} = TrustedCert, CertChain, Options)
when is_list(CertChain), is_list(Options) ->
MaxPathDefault = length(CertChain),
- ValidationState = pubkey_cert:init_validation_state(TrustedCert,
- MaxPathDefault,
- Options),
- path_validation(CertChain, ValidationState).
+ {VerifyFun, Userstat0} =
+ proplists:get_value(verify_fun, Options, ?DEFAULT_VERIFYFUN),
+ try pubkey_cert:validate_time(TrustedCert, Userstat0, VerifyFun) of
+ Userstate1 ->
+ ValidationState = pubkey_cert:init_validation_state(TrustedCert,
+ MaxPathDefault,
+ [{verify_fun, {VerifyFun, Userstate1}} |
+ proplists:delete(verify_fun, Options)]),
+ path_validation(CertChain, ValidationState)
+ catch
+ throw:{bad_cert, cert_expired} = Reason ->
+ {error, Reason}
+ end.
%--------------------------------------------------------------------
-spec pkix_crls_validate(OTPcertificate, DPandCRLs, Options) ->
diff --git a/lib/public_key/test/public_key_SUITE.erl b/lib/public_key/test/public_key_SUITE.erl
index 348e0daa62..cf3b5ea0c8 100644
--- a/lib/public_key/test/public_key_SUITE.erl
+++ b/lib/public_key/test/public_key_SUITE.erl
@@ -1,4 +1,3 @@
-
%%
%% %CopyrightBegin%
%%
@@ -85,6 +84,8 @@
pkix_emailaddress/1,
pkix_path_validation/0,
pkix_path_validation/1,
+ pkix_path_validation_root_expired/0,
+ pkix_path_validation_root_expired/1,
pkix_verify_hostname_cn/1,
pkix_verify_hostname_subjAltName/1,
pkix_verify_hostname_options/1,
@@ -126,12 +127,18 @@ suite() ->
[].
all() ->
- [app, appup,
+ [app,
+ appup,
{group, pem_decode_encode},
encrypt_decrypt,
{group, sign_verify},
- pkix, pkix_countryname, pkix_emailaddress, pkix_path_validation,
- pkix_iso_rsa_oid, pkix_iso_dsa_oid,
+ pkix,
+ pkix_countryname,
+ pkix_emailaddress,
+ pkix_path_validation,
+ pkix_path_validation_root_expired,
+ pkix_iso_rsa_oid,
+ pkix_iso_dsa_oid,
pkix_dsa_sha2_oid,
pkix_crl,
pkix_hash_type,
@@ -142,7 +149,8 @@ all() ->
pkix_verify_hostname_options,
pkix_test_data_all_default,
pkix_test_data,
- short_cert_issuer_hash, short_crl_issuer_hash
+ short_cert_issuer_hash,
+ short_crl_issuer_hash
].
groups() ->
@@ -737,9 +745,24 @@ pkix_path_validation(Config) when is_list(Config) ->
{error, custom_reason} =
public_key:pkix_path_validation(selfsigned_peer, [Trusted], [{verify_fun,
- VerifyFunAndState2}]),
- ok.
-
+ VerifyFunAndState2}]).
+pkix_path_validation_root_expired() ->
+ [{doc, "Test root expiration so that it does not fall between chairs"}].
+pkix_path_validation_root_expired(Config) when is_list(Config) ->
+ {Year, Month, Day} = date(),
+ SRoot = public_key:pkix_test_root_cert("OTP test server ROOT", [{validity, {{Year-2, Month, Day},
+ {Year-1, Month, Day}}}]),
+ #{server_config := Conf} = public_key:pkix_test_data(#{server_chain => #{root => SRoot,
+ intermediates => [],
+ peer => []},
+ client_chain => #{root => [],
+ intermediates => [],
+ peer => []}}),
+ [ICA, Root] = proplists:get_value(cacerts, Conf),
+ true = public_key:pkix_is_self_signed(Root),
+ Peer = proplists:get_value(cert, Conf),
+ {error, {bad_cert, cert_expired}} = public_key:pkix_path_validation(Root, [ICA, Peer], []).
+
%%--------------------------------------------------------------------
%% To generate the PEM file contents:
%%