@@ -109,28 +109,21 @@ OakSessionTlsContext::Create(ServerContextConfig config) {
109109 SSL_GROUP_X25519 };
110110 SSL_CTX_set1_group_ids (ctx.get (), kGroups , std::size (kGroups ));
111111
112- if (config.client_trust_anchor_path . has_value () ||
112+ if (config.client_trust_anchor_provider != nullptr ||
113113 config.custom_cert_verifier .has_value ()) {
114114 SSL_CTX_set_verify (
115115 ctx.get (), SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT , nullptr );
116116
117117 if (config.custom_cert_verifier .has_value ()) {
118118 SSL_CTX_set_cert_verify_callback (ctx.get (), VerifyCallback, nullptr );
119119 }
120-
121- if (config.client_trust_anchor_path .has_value ()) {
122- if (SSL_CTX_load_verify_locations (
123- ctx.get (), config.client_trust_anchor_path ->c_str (), nullptr ) !=
124- 1 ) {
125- return absl::InternalError (" Failed to load trust anchor for client" );
126- }
127- }
128120 }
129121
130122 return std::make_unique<OakSessionTlsContext>(
131123 OakSessionTlsMode::kServer , std::move (ctx),
132124 std::move (config.tls_identity_provider ),
133- std::move (config.custom_cert_verifier ));
125+ std::move (config.client_trust_anchor_provider ),
126+ std::move (config.custom_cert_verifier ), " " );
134127}
135128
136129absl::StatusOr<std::unique_ptr<OakSessionTlsContext>>
@@ -149,17 +142,9 @@ OakSessionTlsContext::Create(ClientContextConfig config) {
149142 SSL_GROUP_X25519 };
150143 SSL_CTX_set1_group_ids (ctx.get (), kGroups , std::size (kGroups ));
151144
152- if (config.server_trust_anchor_path .has_value ()) {
153- if (SSL_CTX_load_verify_locations (ctx.get (),
154- config.server_trust_anchor_path ->c_str (),
155- nullptr ) != 1 ) {
156- return absl::InternalError (" Failed to load trust anchor for server" );
157- }
158- }
159-
160145 // Enable server certificate verification if either a trust anchor or custom
161146 // verifier is configured.
162- if (config.server_trust_anchor_path . has_value () ||
147+ if (config.server_trust_anchor_provider != nullptr ||
163148 config.custom_cert_verifier .has_value ()) {
164149 SSL_CTX_set_verify (ctx.get (), SSL_VERIFY_PEER , nullptr );
165150 }
@@ -174,6 +159,7 @@ OakSessionTlsContext::Create(ClientContextConfig config) {
174159 return std::make_unique<OakSessionTlsContext>(
175160 OakSessionTlsMode::kClient , std::move (ctx),
176161 std::move (config.tls_identity_provider ),
162+ std::move (config.server_trust_anchor_provider ),
177163 std::move (config.custom_cert_verifier ), std::move (expected_server_name));
178164}
179165
@@ -190,15 +176,26 @@ OakSessionTlsContext::NewSession() {
190176 identity_ptr = &*identity;
191177 }
192178
179+ std::optional<std::string> trust_anchor;
180+ const std::string* trust_anchor_ptr = nullptr ;
181+ if (trust_anchor_provider_ != nullptr ) {
182+ auto anchor_or = trust_anchor_provider_->GetTrustAnchor ();
183+ if (!anchor_or.ok ()) {
184+ return anchor_or.status ();
185+ }
186+ trust_anchor = std::move (*anchor_or);
187+ trust_anchor_ptr = &*trust_anchor;
188+ }
189+
193190 switch (mode_) {
194191 case OakSessionTlsMode::kClient :
195192 return OakSessionTlsInitializer::CreateClient (
196- ssl_ctx_.get (), expected_server_name_, identity_ptr,
193+ ssl_ctx_.get (), expected_server_name_, identity_ptr, trust_anchor_ptr,
197194 custom_cert_verifier_.has_value () ? &*custom_cert_verifier_
198195 : nullptr );
199196 case OakSessionTlsMode::kServer :
200197 return OakSessionTlsInitializer::CreateServer (
201- ssl_ctx_.get (), identity_ptr,
198+ ssl_ctx_.get (), identity_ptr, trust_anchor_ptr,
202199 custom_cert_verifier_.has_value () ? &*custom_cert_verifier_
203200 : nullptr );
204201 }
@@ -265,6 +262,7 @@ absl::StatusOr<InitializedSession> OakSessionTlsContext::NewInitializedSession(
265262absl::StatusOr<std::unique_ptr<OakSessionTlsInitializer>>
266263OakSessionTlsInitializer::Create (
267264 SSL_CTX * ssl_ctx, const TlsIdentity* tls_identity,
265+ const std::string* trust_anchor,
268266 const CustomCertVerifier* custom_cert_verifier) {
269267 auto ssl = bssl::UniquePtr<SSL >(SSL_new (ssl_ctx));
270268 if (!ssl) {
@@ -279,6 +277,27 @@ OakSessionTlsInitializer::Create(
279277 }
280278 }
281279
280+ if (trust_anchor != nullptr ) {
281+ const uint8_t * ptr = reinterpret_cast <const uint8_t *>(trust_anchor->data ());
282+ X509 * cert = d2i_X509 (nullptr , &ptr, trust_anchor->size ());
283+ if (cert == nullptr ) {
284+ return absl::InternalError (" failed to parse trust anchor certificate" );
285+ }
286+ X509_STORE * store = X509_STORE_new ();
287+ if (store == nullptr ) {
288+ X509_free (cert);
289+ return absl::InternalError (" failed to create certificate store" );
290+ }
291+ if (X509_STORE_add_cert (store, cert) != 1 ) {
292+ X509_free (cert);
293+ X509_STORE_free (store);
294+ return absl::InternalError (" failed to add certificate to store" );
295+ }
296+ X509_free (cert);
297+ SSL_set1_verify_cert_store (ssl.get (), store);
298+ X509_STORE_free (store);
299+ }
300+
282301 // Enable the BIO API for this SSL instance.
283302 BIO * rbio = BIO_new (BIO_s_mem ());
284303 if (rbio == nullptr ) {
@@ -314,10 +333,10 @@ OakSessionTlsInitializer::Create(
314333absl::StatusOr<std::unique_ptr<OakSessionTlsInitializer>>
315334OakSessionTlsInitializer::CreateClient (
316335 SSL_CTX * ssl_ctx, const std::string& expected_server_name,
317- const TlsIdentity* tls_identity,
336+ const TlsIdentity* tls_identity, const std::string* trust_anchor,
318337 const CustomCertVerifier* custom_cert_verifier) {
319338 absl::StatusOr<std::unique_ptr<OakSessionTlsInitializer>> initializer =
320- OakSessionTlsInitializer::Create (ssl_ctx, tls_identity,
339+ OakSessionTlsInitializer::Create (ssl_ctx, tls_identity, trust_anchor,
321340 custom_cert_verifier);
322341 if (!initializer.ok ()) {
323342 return initializer.status ();
@@ -358,9 +377,10 @@ OakSessionTlsInitializer::CreateClient(
358377absl::StatusOr<std::unique_ptr<OakSessionTlsInitializer>>
359378OakSessionTlsInitializer::CreateServer (
360379 SSL_CTX * ssl_ctx, const TlsIdentity* tls_identity,
380+ const std::string* trust_anchor,
361381 const CustomCertVerifier* custom_cert_verifier) {
362382 absl::StatusOr<std::unique_ptr<OakSessionTlsInitializer>> initializer =
363- OakSessionTlsInitializer::Create (ssl_ctx, tls_identity,
383+ OakSessionTlsInitializer::Create (ssl_ctx, tls_identity, trust_anchor,
364384 custom_cert_verifier);
365385 if (!initializer.ok ()) {
366386 return initializer.status ();
0 commit comments