| // Copyright 2016 The Chromium Authors | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // https://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #ifndef BSSL_PKI_CERT_ISSUER_SOURCE_H_ | |
| #define BSSL_PKI_CERT_ISSUER_SOURCE_H_ | |
| #include <memory> | |
| #include <vector> | |
| #include <openssl/base.h> | |
| #include "parsed_certificate.h" | |
| BSSL_NAMESPACE_BEGIN | |
| // Interface for looking up issuers of a certificate during path building. | |
| // Provides a synchronous and asynchronous method for retrieving issuers, so the | |
| // path builder can try to complete synchronously first. The caller is expected | |
| // to call SyncGetIssuersOf first, see if it can make progress with those | |
| // results, and if not, then fall back to calling AsyncGetIssuersOf. | |
| // An implementations may choose to return results from either one of the Get | |
| // methods, or from both. | |
| class OPENSSL_EXPORT CertIssuerSource { | |
| public: | |
| class OPENSSL_EXPORT Request { | |
| public: | |
| Request() = default; | |
| Request(const Request &) = delete; | |
| Request &operator=(const Request &) = delete; | |
| // Destruction of the Request cancels it. | |
| virtual ~Request() = default; | |
| // Retrieves issuers and appends them to `issuers`. | |
| // | |
| // GetNext should be called again to retrieve any remaining issuers. | |
| // | |
| // If no issuers are left then `issuers` will not be modified. This | |
| // indicates that the issuers have been exhausted and GetNext() should | |
| // not be called again. | |
| virtual void GetNext(ParsedCertificateList *issuers) = 0; | |
| }; | |
| virtual ~CertIssuerSource() = default; | |
| // Finds certificates whose Subject matches `cert`'s Issuer. | |
| // Matches are appended to `issuers`. Any existing contents of `issuers` will | |
| // not be modified. If the implementation does not support synchronous | |
| // lookups, or if there are no matches, `issuers` is not modified. | |
| virtual void SyncGetIssuersOf(const ParsedCertificate *cert, | |
| ParsedCertificateList *issuers) = 0; | |
| // Finds certificates whose Subject matches `cert`'s Issuer. | |
| // If the implementation does not support asynchronous lookups or can | |
| // determine synchronously that it would return no results, `*out_req` | |
| // will be set to nullptr. | |
| // | |
| // Otherwise a request is started and saved to `out_req`. The results can be | |
| // read through the Request interface. | |
| virtual void AsyncGetIssuersOf(const ParsedCertificate *cert, | |
| std::unique_ptr<Request> *out_req) = 0; | |
| }; | |
| BSSL_NAMESPACE_END | |
| #endif // BSSL_PKI_CERT_ISSUER_SOURCE_H_ |