Skip to content

Commit 0ab5a34

Browse files
committed
public_key: REVIEW improve pubkey_ocsp:verify_responder_cert
1 parent 95f08e0 commit 0ab5a34

File tree

3 files changed

+19
-26
lines changed

3 files changed

+19
-26
lines changed

lib/public_key/src/pubkey_ocsp.erl

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -156,14 +156,18 @@ get_nonce_value([#'Extension'{
156156
get_nonce_value([_Extn | Rest]) ->
157157
get_nonce_value(Rest).
158158

159+
verify_signature(_, _, _, [], _, _) ->
160+
{error, ocsp_responder_cert_not_found};
159161
verify_signature(ResponseDataDer, SignatureAlgo, Signature,
160-
Certs, ResponderID, IssuerCert) ->
161-
case find_responder_cert(ResponderID, Certs, IssuerCert) of
162-
{ok, Cert} ->
163-
do_verify_signature(
164-
ResponseDataDer, Signature, SignatureAlgo, Cert);
165-
{error, Reason} ->
166-
{error, Reason}
162+
[Cert | TCerts], ResponderID, IssuerCert) ->
163+
maybe
164+
true ?= is_responder_cert(ResponderID, Cert),
165+
true ?= is_authorized_responder(Cert, IssuerCert),
166+
ok ?= do_verify_signature(ResponseDataDer, Signature, SignatureAlgo, Cert)
167+
else
168+
_->
169+
verify_signature(ResponseDataDer, SignatureAlgo, Signature,
170+
TCerts, ResponderID, IssuerCert)
167171
end.
168172

169173
verify_past_timestamp(Timestamp) ->
@@ -192,18 +196,12 @@ verify_next_update(asn1_NOVALUE) ->
192196
verify_next_update(NextUpdate) ->
193197
verify_future_timestamp(NextUpdate).
194198

195-
find_responder_cert(_ResponderID, [], _) ->
196-
{error, ocsp_responder_cert_not_found};
197-
find_responder_cert(ResponderID, [Cert | TCerts], IssuerCert) ->
198-
maybe
199-
true ?= is_responder_cert(ResponderID, Cert),
200-
ok ?= verify_responder_cert(Cert, IssuerCert),
201-
{ok, Cert}
202-
else
203-
_-> find_responder_cert(ResponderID, TCerts, IssuerCert)
204-
end.
199+
is_responder_cert({byName, Name}, Cert) ->
200+
public_key:der_encode('Name', Name) == get_subject_name(Cert);
201+
is_responder_cert({byKey, Key}, Cert) ->
202+
Key == crypto:hash(sha, get_public_key(Cert)).
205203

206-
verify_responder_cert(Cert, IssuerCert) ->
204+
is_authorized_responder(Cert, IssuerCert) ->
207205
Case1 =
208206
%% the CA who issued the certificate in question signed the
209207
%% response
@@ -224,7 +222,7 @@ verify_responder_cert(Cert, IssuerCert) ->
224222

225223
case lists:any(fun(E) -> E() end, [Case1, Case2, Case3]) of
226224
true ->
227-
ok;
225+
true;
228226
_ ->
229227
not_authorized_responder
230228
end.
@@ -244,11 +242,6 @@ get_public_key_rec(#'OTPCertificate'{tbsCertificate = TbsCert}) ->
244242
PKInfo = TbsCert#'OTPTBSCertificate'.subjectPublicKeyInfo,
245243
PKInfo#'OTPSubjectPublicKeyInfo'.subjectPublicKey.
246244

247-
is_responder_cert({byName, Name}, Cert) ->
248-
public_key:der_encode('Name', Name) == get_subject_name(Cert);
249-
is_responder_cert({byKey, Key}, Cert) ->
250-
Key == crypto:hash(sha, get_public_key(Cert)).
251-
252245
get_subject_name(#'OTPCertificate'{tbsCertificate = TbsCert}) ->
253246
public_key:pkix_encode('Name', TbsCert#'OTPTBSCertificate'.subject, otp).
254247

lib/ssl/src/ssl_trace.erl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,12 +437,11 @@ trace_profiles() ->
437437
{cert_status_check, 5}]},
438438
{public_key, [{ocsp_extensions, 1}, {pkix_ocsp_validate, 4},
439439
{otp_cert, 1}]},
440-
{pubkey_ocsp, [{find_responder_cert, 3}, {do_verify_signature, 4},
440+
{pubkey_ocsp, [{do_verify_signature, 4},
441441
{verify_response, 4}, {verify_nonce, 2},
442442
{verify_signature, 6},
443443
{is_responder_cert, 2}, {find_single_response, 3},
444444
{status, 1}, {match_single_response, 4},
445-
{verify_responder_cert, 2},
446445
{designated_for_ocsp_signing, 1}]},
447446
{ssl, [{opt_stapling, 3}]},
448447
{ssl_certificate, [{verify_cert_extensions, 4}]},

lib/ssl/test/openssl_stapling_SUITE.erl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ init_per_testcase_helper(Testcase, Config0) ->
124124
ct:timetrap({seconds, 10}),
125125
Default = "otpCA",
126126
TestcaseMapping = #{staple_by_issuer => Default,
127+
staple_by_trusted => "erlangCA",
127128
staple_by_designated => "b.server",
128129
staple_not_designated => "a.server",
129130
staple_wrong_issuer => "localhost"},

0 commit comments

Comments
 (0)